hdu 2844 coins (多重背包)
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int a[120],c[120]; int dp[100000+100]; int main() { int n,m; int i,j,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,-1,sizeof(dp)); dp[0]=1; for(i=0;i<n;i++) { for(j=1;j<=c[i];j*=2) { int temp=j*a[i]; for(k=m;k>=temp;k--) { if(dp[k-temp]!=-1) dp[k]=1; } c[i]-=j; } int temp=c[i]*a[i]; for(k=m;k>=temp;k--) { if(dp[k-temp]!=-1) dp[k]=1; } } int ans=0; for(i=1;i<=m;i++) { if(dp[i]==1) ans++; } printf("%d\n",ans); } return 0; }