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;
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 饭卡(背包)的主要内容,如果未能解决你的问题,请参考以下文章