http://acm.hdu.edu.cn/showproblem.php?pid=6083
题意:
思路:
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: ",++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 ",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?' ':' '); 67 } 68 } 69 return 0; 70 }