HDU2546 饭卡(背包)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<\n;
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\n", m + 5 - pri[n - 1] - num[m]);
39     }
40     return 0;

41 } 

以上是关于HDU2546 饭卡(背包)的主要内容,如果未能解决你的问题,请参考以下文章

(01背包 排序+特判)饭卡(hdu 2546)

HDU 2546 饭卡(01背包裸题)

hdu 2546 饭卡 (01背包)

hdu2546 饭卡 01-背包问题

HDU 2546 饭卡(0-1背包)

HDU2546 饭卡(背包)