首页 > 代码库 > hdu2844 coins 多重背包
hdu2844 coins 多重背包
1 #include<stdio.h> 2 #include<string.h> 3 int a[102],c[102],dp[100005]; 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 } 8 void CompletePack(int v,int w,int m) //完全背包 9 {10 for(int j=v;j<=m;j++)11 dp[j]=max(dp[j],dp[j-v]+w);12 }13 void ZeroOnePack(int v,int w,int m) //01背包14 {15 for(int j=m;j>=v;j--)16 dp[j]=max(dp[j],dp[j-v]+w);17 }18 void MultiPack(int v,int w,int m,int c) //多重背包19 {20 if(v*c>=m) //体积乘以数量大于总体积,说明不能完全装完,相当于有无穷件,用完全背包21 CompletePack(v,w,m);22 else //可以装完,用01背包23 {24 int k=1;25 while(k<c) //二进制优化26 {27 ZeroOnePack(k*v,k*w,m);28 c-=k;29 k*=2;30 }31 ZeroOnePack(c*v,c*w,m);32 }33 }34 int main()35 {36 int n,i,j,m,k;37 while(scanf("%d%d",&n,&m)!=EOF)38 {39 if(n==0&&m==0) break;40 for(i=0;i<n;i++)41 scanf("%d",&a[i]); //a[i]既是物体的体积,又是物体的价值42 for(i=0;i<n;i++)43 scanf("%d",&c[i]); //c[i]是物体的数量44 memset(dp,0,sizeof(dp));45 for(i=0;i<n;i++)46 {47 MultiPack(a[i],a[i],m,c[i]);48 }49 int count=0; //计数50 for(i=1;i<=m;i++)51 if(dp[i]==i) //可以组合且不用找钱52 count++;53 printf("%d\n",count);54 }55 return 0;56 }
hdu2844 coins 多重背包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。