题解:背包问题方案总数,用二进制优化。
#include <cstdio> #include <iostream> using namespace std; int f[100005]; int a[105],c[105]; int main() { int i,j,k,n,m,cnt; 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(f,0,sizeof(f)); f[0]=1; for(i=0;i<n;i++) { cnt=c[i]; for(k=1;k<=cnt;k<<=1) { for(j=m;j>=k*a[i];j--) f[j]+=f[j-k*a[i]]; cnt-=k; } if(cnt) for(j=m;j>=cnt*a[i];j--) f[j]+=f[j-cnt*a[i]]; } int sum=0; for(i=1;i<=m;i++) if(f[i]) sum++; printf("%d\n",sum); } return 0; }