//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);
}
转载于:https://blog.51cto.com/22222222222/1710731