多重背包,二进制优化
#include<stdio.h> #include<string.h> int dp[100005]; int num[105]; int v[105]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=0;i<n;i++) scanf("%d",&v[i]); for(int i=0;i<n;i++) scanf("%d",&num[i]); memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<n;i++) { int sum=num[i]; for(int j=1;j<=sum;j<<=1) { for(int k=m;k>=j*v[i];k--) { dp[k]+=dp[k-j*v[i]]; } sum-=j; } if(sum) for(int j=m;j>=sum*v[i];j--) dp[j]+=dp[j-sum*v[i]]; } int r=0; for(int i=1;i<=m;i++) if(dp[i])r++; printf("%d\n",r); } return 0; }