标签:0/1背包
//Buy the souvenirs //当发现由熟悉的动态规划题目变形得来的题目时,在原来的状态中加一维以满足新的限制是一种比较通用的方法。 //data:10 4 //1 2 3 4 5 6 7 8 9 0 #include<stdio.h> #include<string.h> int max(int a,int b); int main(){ int t,n,m,p[35]; int i,j,dp[505][2]; while(scanf("%d",&t)!=EOF){ while(t--){ scanf("%d%d",&n,&m); for(i=0;i<n;i++){ scanf("%d",&p[i]); } memset(dp,0,sizeof(dp)); for(i=0;i<m;i++){ dp[i][1]=1; } for(i=0;i<n;i++){ for(j=m;j>=p[i];j--){ if(dp[j][0]==dp[j-p[i]][0]+1) dp[j][1]=dp[j-p[i]][1]+dp[j][1]; else if(dp[j][0]<dp[j-p[i]][0]+1) dp[j][1]=dp[j-p[i]][1]; dp[j][0]=max(dp[j][0],dp[j-p[i]][0]+1);//状态转移方程 /* if(dp[j][0]==dp[j-p[i]][0]+1){ dp[j][1]=dp[j-p[i]][1]+dp[j][1]; } else if(dp[j][0]<dp[j-p[i]][0]+1){ dp[j][0]=dp[j-p[i]][0]+1; dp[j][1]=dp[j-p[i]][1]; } */ } } if(!dp[m][0]) printf("Sorry, you can‘t buy anything.\n"); else printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][1],dp[m][0]); } } return 0; } int max(int a,int b){ return (a>b?a:b); }
本文出自 “apple” 博客,请务必保留此出处http://22222222222.blog.51cto.com/9928498/1710731
标签:0/1背包
原文地址:http://22222222222.blog.51cto.com/9928498/1710731