HDU 2546 - 饭卡
传送门
思路
如果一开始的钱不足五块钱,什么也买不了,直接输出。
如果多于五块,拿出五块买最贵的东西,剩下的能买多少买多少。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 100;
int dp[MAXN], vage[MAXN];
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j, n, money;
while (scanf("%d", &n), n)
{
memset(dp, 0, sizeof(dp)), j = 0;
for (i = 0; i < n; i++)
scanf("%d", &vage[i]);
scanf("%d", &money);
if (money < 5)
{
printf("%d\n", money);
continue;
}
sort(vage, vage + n);
money -= 5;
int boss = vage[n - 1];
for (i = 0; i < n - 1; i++)
for (j = money; j > 0; j--)
if (j - vage[i] >= 0)
dp[j] = max(dp[j], dp[j - vage[i]] + vage[i]);
printf("%d\n", money - dp[money] + 5 - boss);
}
return 0;
}