题意大概: n种物品,m元钱,求当买取最多物品的方案数
分析:在01背包的基础上,加开一维用以记录方案数,dp[v][0] 表示容量为v时,背包所盛放的物品数量,即买的物品个数。dp[v][1],表示此时的方案数。
#include<cstdio>
#include<cstring>
int dp[505][2],c[35];
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",c+i);
memset(dp,0,sizeof(dp)); //初始化dp
for(int j=0;j<=m;j++) //初始化所有的方案数为1
dp[j][1]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=c[i];j--){
if(dp[j][0]<dp[j-c[i]][0]+1){
dp[j][0]=dp[j-c[i]][0]+1;
dp[j][1]=dp[j-c[i]][1];
}
else if(dp[j][0]==dp[j-c[i]][0]+1)
dp[j][1]+=dp[j-c[i]][1];
}
if(dp[m][0])
printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][1],dp[m][0]);
else
printf("Sorry, you can't buy anything.\n");
}
return 0;
}