代码:
//9. 分组背包问题 //多重背包问题是分组背包问题的一个特殊情况 /* 每个组的物品有s+1种选择 for(int i = 0;i<n;i++) { for(int j = m;j>=v;j--) { dp[j] = max{dp[j],dp[j-v[0]]+w[0],dp[j-v[i]]+w[i],.....,dp[j - v[s-1]] + w[s-1]}; } } dp[m] */ #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 110; int n, m; int dp[N], v[N], w[N]; int main() { cin >> n >> m; for (int i = 0; i < n; i++) { int s; cin >> s; for (int j = 0; j < s; j++) cin >> v[j] >> w[j]; for (int j = m; j >= 0; j--) { for (int k = 0; k < s; k++) { if (j>=v[k]) dp[j] = max(dp[j], dp[j - v[k]] + w[k]); } } } cout << dp[m] << endl; return 0; }
原文地址:https://www.cnblogs.com/gcter/p/11344943.html
时间: 2024-10-22 00:49:11