原题链接:
题解:
可以将多重背包问题视为特殊的分组背包问题,只不过多重背包问题每组的物品在容量和价格上是一样的,而普通的分组背包问题中每组的物品在容量和价格上是不同的。
因此只能采用朴素做法(三重循环),若某组内有s个物品,则对于该组物品有s+1种选择。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, V;
const int N = 1e3 + 10;
int v[N], w[N];
int f[N];//f[j]表示在背包容量为j的前提下的最优解
int main() {
cin >> n >> V;
for (int i = 1;i <= n;i++) {
int s;cin >> s;
for (int t = 1;t <= s;t++) cin >> v[t] >> w[t];
for (int j = V;j >= 0;j--) {//这里不再是j>=v[i]了,是因为组内物品不一致
for (int k = 1;k <= s;k++) {
if (j >= v[k]) f[j] = max(f[j], f[j - v[k]] + w[k]);
}
}
}
cout << f[V];
}