hdu 2126 Buy the souvenirs

来源:互联网 发布:网络极品萝莉 萌小兔 编辑:程序博客网 时间:2024/04/30 03:02

hdu 2126

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

#include<stdio.h>#include<string.h>#define maxn 550#define INF 1<<30int 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];elsedp[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");elseprintf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",s,flag);}return 0;}


原创粉丝点击