HDU2546 饭卡(背包)

开始写成01背包的形式,求m元可买物品价值的最大值

dp[j] = max(dp[j], dp[j - pri[i]] + pri[i])

结果为m - dp[m] 

但后来发现是有问题的, 比如这组过不去

5
15 14 13 13 42
60

正解应该m-5 >= 0时买尽量多的物品,然后剩下的钱买价值最大的物品。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<algorithm>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include<cmath>
11 using namespace std;
12 typedef long long LL;
13 const int N = 10008, INF = 0x3F3F3F3F;
14 #define MS(a, num) memset(a, num, sizeof(a))
15 int pri[N];
16 int num[5000];
17 int main(){
18     freopen("2546.txt""r", stdin);
19     int n, m;
20     //int *dp = num + 1000;
21     while(~scanf("%d",  &n ) && n){
22         MS(num, 0);
23         for(int i = 0 ;i < n; i++){
24             scanf("%d", &pri[i]);
25         }
26         scanf("%d", &m);
27         sort(pri, pri + n);
28         if(m < 5){
29             cout<<m<<' ';
30             continue;
31         }
32         m -= 5;
33         for(int i= 0; i < n - 1; i++){
34             for(int j = m; j >= pri[i]; j--){
35                 num[j] = max(num[j], num[j - pri[i]] + pri[i]);
36             }
37         }
38         printf("%d ", m + 5 - pri[n - 1] - num[m]);
39     }
40     return 0;

41 } 

原文地址:https://www.cnblogs.com/IMGavin/p/5639712.html