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];
View Code
把排序的位置放错了,一直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
相关文章推荐
- hdu 2126 Buy the souvenirs(求方案数的背包)
- hdu 2126 Buy the souvenirs (01背包输出方案数)
- hdu 2126 Buy the souvenirs(求方案数的背包)
- hdu 2126 Buy the souvenirs 二维01背包方案总数
- Buy the souvenirs - HDU 2126 背包dp
- 01背包变形 之 hdu 2126 Buy the souvenirs
- hdu 2126 Buy the souvenirs(二维0/1背包)
- HDU 2126 (背包方法数) Buy the souvenirs
- hdu 2126 Buy the souvenirs(记录总方案数的01背包)
- hdu 2126 Buy the souvenirs(0-1+最大方案数)
- hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)
- HDU 2126 Buy the souvenirs (贪心&0-1背包最优解的个数)
- HDU 2126 Buy the souvenirs 01背包 输出方案数
- hdu 2126 Buy the souvenirs(01背包求最大容量方法数)
- hdu 2126 Buy the souvenirs(求方案数)
- HDU 2126 Buy the souvenirs(DP:01背包)
- HDU2126——背包DP(开状态)——Buy the souvenirs
- Buy the souvenirs(hdu(2126)
- HDU 2126 Buy the souvenirs
- hdu 2126 Buy the souvenirs (二维01背包)