AcWing 9. 分组背包问题——借鉴多重背包来解决
原题链接
中等
作者:
虹之间
,
2020-11-03 10:27:57
,
所有人可见
,
阅读 391
#include <iostream>
using namespace std;
const int N = 110;
int f[N][N], v[N], w[N];
// 参考多重背包,每个背包最多可以被用si次,这里相当于每组背包最多用1次
// f[i][j] 表示只用前i组物品和体积为j的情况下最多能装下多少价值的物品
// f[i][j] = max(f[i - 1][j], f[i - 1][j - 第i组的某个物品] + 该物品的价值)
int main()
{
int n, m; cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
int num; cin >> num;
for(int j = 0; j < num; j ++ ) cin >> v[j] >> w[j];
for(int j = 0; j <= m; j ++ ){
f[i][j] = f[i - 1][j];
for(int k = 0; k < num; k ++ )
if(j >= v[k])
f[i][j] = max(f[i][j], f[i - 1][j - v[k]] + w[k]);
}
}
int res = 0;
for(int i = 1; i <= n; i ++ ) res = max(res, f[i][m]);
cout << res << endl;
return 0;
}