http://acm.hdu.edu.cn/showproblem.php?pid=6083

题意:

HDU 6083 度度熊的午饭时光(01背包+记录路径)_01背包

 

思路:

01背包+路径记录。

题目有点坑,我一开始逆序枚举菜品,然后一直WA,可能这样的话路径记录会有点问题。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,ll> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn=100+5;
17 
18 int n, m;
19 int val[1005],w[1005];
20 int d[1005];
21 int path[1005][1005];
22 vector<int> ans;
23 
24 int main()
25 {
26     //freopen("in.txt","r",stdin);
27     int kase=0;
28     int T;
29     scanf("%d",&T);
30     while(T--)
31     {
32         scanf("%d",&n);
33         scanf("%d",&m);
34         for(int i=1;i<=m;i++)  scanf("%d%d",&val[i],&w[i]);
35         memset(d,0,sizeof(d));
36         memset(path,0,sizeof(path));
37 
38         for(int i=1;i<=m;i++)
39         {
40             for(int j=n;j>=w[i];j--)
41             {
42                 if(d[j-w[i]]+val[i]>d[j])
43                 {
44                     d[j]=d[j-w[i]]+val[i];
45                     path[i][j]=1;
46                 }
47             }
48         }
49         printf("Case #%d:\n",++kase);
50         int sum=0;
51         ans.clear();
52         for(int i=m,j=n;i>=1 && j>=0;i--)
53         {
54             if(path[i][j])
55             {
56                 ans.push_back(i);
57                 j-=w[i];
58                 sum+=w[i];
59             }
60         }
61         printf("%d %d\n",d[n],sum);
62         sort(ans.begin(),ans.end());
63         int sz=ans.size();
64         for(int i=0;i<sz;i++)
65         {
66             printf("%d%c",ans[i],i==sz-1?'\n':' ');
67         }
68     }
69     return 0;
70 }