#include<stdio.h> #include<string.h> int a[102],c[102],dp[100005]; int max(int a,int b) { return a>b?a:b; } void CompletePack(int v,int w,int m) { for(int j=v;j<=m;j++) dp[j]=max(dp[j],dp[j-v]+w); } void ZeroOnePack(int v,int w,int m) { for(int j=m;j>=v;j--) dp[j]=max(dp[j],dp[j-v]+w); } void MultiPack(int v,int w,int m,int c) { if(v*c>=m) CompletePack(v,w,m); else { int k=1; while(k<c) { ZeroOnePack(k*v,k*w,m); c-=k; k*=2; } ZeroOnePack(c*v,c*w,m); } } int main() { int n,i,j,m,k; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { MultiPack(a[i],a[i],m,c[i]); } int count=0; for(i=1;i<=m;i++) if(dp[i]==i) count++; printf("%d\n",count); } return 0; }
《动态规划》hdoj acm 3.3.2 多重背包
最新推荐文章于 2021-03-21 17:20:59 发布