用滚动数组写过背包的可以很容易理解 O(nm)做法,枚举每种物品,跟前面出现过的组合;同时计数当前物品的数量;
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> typedef long long ll; using namespace std; const int maxn = 100 + 7; int n, m; int w[maxn], c[maxn]; int sum[maxn*1000]; int vis[maxn*1000]; int main() { while(~scanf("%d%d", &n, &m) && n+m) { memset(vis, 0, sizeof vis); for(int i = 1; i <= n; ++i) { scanf("%d", &w[i]); } for(int i = 1; i <= n; ++i) { scanf("%d", &c[i]); } int ans = 0; vis[0] = 1; for(int i = 1; i <= n; ++i) { memset(sum, 0, sizeof sum); for(int j = w[i]; j <= m; ++j) { if(!vis[j] && vis[j-w[i]] && sum[j-w[i]] < c[i]) { vis[j] = 1; sum[j] = sum[j-w[i]] + 1; ans++; } } } cout << ans << endl; } return 0; }