原题链接:
题解:
相比于01背包问题,本题规定了第 i 种物品最多有 si 件,因此就在01背包的基础上多加一层循环即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, V;
const int N = 1e3 + 10;
int v[N], w[N], s[N];
int f[N];//f[j]表示在背包容量为j的前提下的最优解
int main() {
cin >> n >> V;
for (int i = 1;i <= n;i++) cin >> v[i] >> w[i] >> s[i];
for (int i = 1;i <= n;i++) {
for (int j = V;j >= v[i];j--) {
for (int k = 1;k <= s[i] && k * v[i] <= j;k++) {
f[j] = max(f[j], f[j - k * v[i]] + k * w[i]);
}
}
}
cout << f[V];
}
缺点:
使用3重循环,时间复杂度较高。 对其优化我们将在下节展开介绍。