//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); }
Hdu2126
原创
©著作权归作者所有:来自51CTO博客作者52apple的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:Hdu2955

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HDU2126 二维背包
HDU2126对背包还是不太熟练啊…刚开始看背包,于是做到这些题目满脑子都是放入体,另外注意
#include i++ ios