Coins HDU 2844
不能用最基础的多重背包模板:会超时的!!!
之后看了二进制优化了的多重背包。
就是把多重转变成01背包:
具体思路见:http://www.cnblogs.com/tt123/p/3280521.html
1 #include<iostream> 2 #include<algorithm> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 int dp[100005],a1[100005],a[105],b[105]; 7 int main() 8 { 9 int n,m,i,j,k,s,cout1; 10 while(scanf("%d%d",&n,&m)!=EOF) 11 { 12 if(n==0&&m==0) 13 break; 14 for(i=0;i<n;i++) 15 scanf("%d",&a[i]); 16 for(i=0;i<n;i++) 17 scanf("%d",&b[i]); 18 cout1=0; 19 for(i=0;i<n;i++) 20 { 21 for(k=1;k<=b[i];k<<=1) 22 { 23 a1[cout1++]=k*a[i]; 24 b[i]-=k; 25 } 26 if(b[i]>0) 27 a1[cout1++]=b[i]*a[i]; 28 } 29 memset(dp,0,sizeof(dp)); 30 for(i=0;i<cout1;i++) 31 for(j=m;j>=a1[i];j--) 32 dp[j]=max(dp[j],dp[j-a1[i]]+a1[i]); 33 s=0; 34 for(i=1;i<=m;i++) 35 if(dp[i]==i) 36 s++; 37 printf("%d ",s); 38 } 39 return 0; 40 }