5.H - Coins 多重背包模板
题目连接: http://acm.hust.edu.cn/vjudge/contest/126708#problem/H
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1005],b[105],dp[100005]; void inital() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); } void bag01(int v,int c,int m) { for(int i=m;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+v); } void complete(int v,int c,int m) { for(int i=c;i<=m;i++) dp[i]=max(dp[i],dp[i-c]+v); } void multiply(int v,int c,int m,int am) { if(v*am>m) complete(v,c,m); else { int k=1; while(k<am) { bag01(k*v,k*c,m); am-=k; k*=2; } bag01(am*v,am*c,m); } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; inital(); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) multiply(a[i],a[i],m,b[i]); int sum=0; for(int i=1;i<=m;i++) //cout<<dp[i]<<endl; if(dp[i]==i) sum++; printf("%d\n",sum); } return 0; }