http://acm.hdu.edu.cn/showproblem.php?pid=2546
先用5元钱买最贵的东西,然后用剩下的钱买价值最大的东西,也就是01背包问题。
先进行排序,找出最大的,然后对剩下的商品进行动态规划,而顺序不影响。
参考博客:http://blog.csdn.net/juststeps/article/details/8714303
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <cstring>
#define eps 1e-8
using namespace std;
int main() {
//freopen("input.txt","r",stdin);
int n;
int price[1010];
int m;
int dp[1010];
while(~scanf("%d", &n) && n) {
int i, j;
for(i = 0; i < n; i++) {
scanf("%d", &price[i]);
}
scanf("%d", &m);
if(m < 5) {
printf("%d\n", m);
continue;
}
sort(price, price + n);
memset(dp, 0, sizeof(dp));
m -= 5;
for(i = 0; i < n - 1; i++) {
for(j = m; j - price[i] >= 0; j--) {
dp[j] = (dp[j - price[i]] + price[i]) > dp[j] ? (dp[j - price[i]] + price[i]) : dp[j];
}
}
printf("%d\n", m + 5 - price[n - 1] - dp[m]);
}
return 0;
}