思路
一个裸的多重背包问题,然后就是一个01背包的求方案数问题,只不过这里统计的是那些取值是有方案的。
代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=100000;
int n,m;
int f[N];
int w[N],c[N];
vector<int> v;
int main(){
while(cin >> n >> m,n&&m){
v.clear();
memset(f,0,sizeof f);
for(int i=0;i<n;i++)cin >> w[i];
for(int i=0;i<n;i++)cin >> c[i];
for(int i=0;i<n;i++){
for(int k=1;k<=c[i];k*=2){
c[i]-=k;
v.push_back(w[i]*k);
}
if(c[i]>0)v.push_back(c[i]*w[i]);
}
f[0]=1;
for(int i=0;i<v.size();i++){
for(int j=m;j>=v[i];j--){
f[j]+=f[j-v[i]];
}
}
int res=0;
for(int i=1;i<=m;i++){
if(f[i])res++;
}
cout << res << "\n";
}
}