二维数组形式
结合y总和这个视频理解(我是这样的)
https://www.bilibili.com/video/BV1uW4y1G7Gs/?spm_id_from=333.788.top_right_bar_window_default_collection.content.click&vd_source=d91a92602de1e28c4fc93efda25d639d
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) //读入数据
cin >> v[i] >> w[i];
// 当i==0时, 前i个权重为0,因为是全局变量初始化为零所以不用再次初始化
// for (int i = 0; i <= m; i++) f[0][i] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (v[i] <= j) // 如果当前可以加入,则与不加进行比较,看看哪个更优
f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
else
f[i][j] = f[i - 1][j]; // 不行就继承上个值
}
}
cout << f[n][m] << endl;
return 0;
}
一维数组(滚动数组)
结合y总和这个视频进行理解(我是这样的)
https://www.bilibili.com/video/BV1BU4y177kY/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=d91a92602de1e28c4fc93efda25d639d
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int v[N], w[N];
int n, m;
int f[N];
// 通过观察二维数组的方法,发现很多步骤是重叠的,这是就可以压缩为一个一维数组
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
for (int i = 1; i <= n; i++) // 从一开始是为了好理解
for (int j = m; j >= v[i]; j--) // 倒序遍历是为了避免污染
f[j] = max(f[j], f[j - v[i]] + w[i]);
cout << f[m] << endl;
return 0;
}