$\LARGE\color{orange}{刷题日记(算法提高课)}$
多重背包的朴素做法与完全背包的朴素做法思路一样
需要有三重循环,第三层循环的是选择第 $i$ 个物品的数量,从 0 到 $s$ 并且 $k*v\le j$
剩下的写法跟 01 背包没什么区别
完整代码:
#include <iostream>
using namespace std;
const int N = 110;
int f[N][N];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
int v, w, s;
cin >> v >> w >> s;
for(int j = 1; j <= m; j++)
for(int k = 0; k <= s && k * v <= j; k++)
f[i][j] = max(f[i][j], f[i - 1][j - k * v] + k * w);
}
cout << f[n][m] << endl;
return 0;
}
空间优化版本:
改动与 01 背包同样一致
```cpp
#include [HTML_REMOVED]
using namespace std;
const int N = 110;
int f[N];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i)
{
int v, w, s;
cin >> v >> w >> s;
for(int j = m; j >= 1; j–)
for(int k = 0; k <= s && k * v <= j; k)
f[j] = max(f[j], f[j - k * v] + k * w);
}
cout << f[m] << endl;
return 0;
}
```