您的位置:首页 > 其它

hdu 2126 Buy the souvenirs(求方案数的背包)

2013-07-16 16:30 435 查看
推荐链接http://blog.csdn.net/zizaimengzhongyue/article/details/9332121

把排序的位置放错了,一直WA,不太细心

f[i][j]含义: i 元可以买 j 种物品的方案数,方案数f[i]=f[i]+f[i-a[i]],很容易得到 f[i][j]=f[i][j]+f[i-a[i][j];

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int t,n,m,i,j,k;
int a[35],f[505][35];
scanf("%d",&t);
while(t--)
{
int tt;
scanf("%d%d",&n,&m);
int sum=0;
tt=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);

}
qsort(a+1,n,sizeof(a[0]),cmp);
for(i=1;i<=n;i++)
{
sum+=a[i];
if(sum<=m)
tt=i;
}
if(sum<=m)
{
printf("You have 1 selection(s) to buy with %d kind(s) of souvenirs.\n",n);
continue;
}
if(a[1]>m)
{
printf("Sorry, you can't buy anything.\n");
continue;
}
memset(f,0,sizeof(f));
for(i=0;i<=m;i++)
f[i][0]=1;
for(i=1;i<=n;i++)
{
for(j=m;j>=a[i];j--)
{
for(k=tt;k>=1;k--)
f[j][k]=f[j][k]+f[j-a[i]][k-1];
}
}
if(f[m][tt]==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",f[m][tt],tt);

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: