您的位置:首页 > 其它

hdu 2126 Buy the souvenirs

2013-02-28 16:10 204 查看
hdu 2126

m元,n种纪念品,求能买最多种数的方法数

#include<stdio.h>
#include<string.h>
#define maxn 550
#define INF 1<<30
int dp[maxn][35],n,m,t,flag;
int c[35],w[35];
int main()
{
int i,j,k;
scanf("%d",&t);
while(t--)
{
memset(c,0,sizeof(c));
memset(w,1,sizeof(w));
memset(dp,0,sizeof(dp));
scanf("%d %d",&n,&m);
flag=-1;
for(i=0;i<n;i++)
scanf("%d",&c[i]);
for(i=0;i<m;i++)
{
for(j=0;j<=n;j++)
dp[i][j]=INF;
}
//for(j=0;j<=n;j++)   //这是错的,因为0元只能买0种物品
//	dp[0][j]=1;
dp[0][0]=1;         //起点
for(i=0;i<n;i++)
{
for(j=m;j>=c[i];j--)      //花j元
{
for(k=n;k>=1;k--)     //买k种
{
if(dp[j-c[i]][k-1]!=INF)
{
//dp[j][k]=dp[j-c[i]][k-1];
if(dp[j][k]==INF)
dp[j][k]=dp[j-c[i]][k-1];
else
dp[j][k]+=dp[j-c[i]][k-1];
if(dp[j][k]!=INF&&k>flag)
flag=k;   //计最大种数
}
}
}
}
//printf("flag=%d\n",flag);
int s=0;  //计组合数
for(i=1;i<=m;i++)
{
if(dp[i][flag]!=INF)
s+=dp[i][flag];
}
if(s==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",s,flag);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: