背包问题(携带研究材料)
解题思路:动态规划(二维)
首先读取物品数量 m 和背包容量 n,再分别读取 m 个物品的重量数组 weight 和价值数组 value,接着初始化一个 m * (n + 1) 的二维 dp 数组,dp[i][j] 表示前 i + 1 个物品放入容量为 j 的背包能获得的最大价值,并初始化第一行当背包容量 j 大于等于第一个物品重量时,dp[0][j] 赋值为第一个物品的价值,然后通过双层循环遍历剩余物品和所有容量,若当前容量 j 小于第 i 个物品重量,则无法放入该物品,dp[i][j] 等于上一行同列的值,即不选该物品的最大价值,否则取不选该物品 dp[i - 1][j] 和选该物品 dp[i - 1][j - weight[i]] + value[i] 中的较大值更新 dp[i][j],最终输出 dp[m - 1][n],即所有物品放入容量为 n 的背包能获得的最大价值。
具体代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int m;
int n;
cin >> m >> n;
vector<int> weight(m, 0);
vector<int> value(m, 0);
for (int i = 0; i < m; i++) cin >> weight[i];
for (int i = 0; i < m; i++) cin >> value[i];
vector<vector<int>> dp(m, vector<int>(n + 1, 0));
for (int i = weight[0]; i <= n; i++) dp[0][i] = value[0];
for (int i = 1; i < m; i++) {
( j = ; j <= n; j++) {
(j < weight[i]) dp[i][j] = dp[i - ][j];
dp[i][j] = (dp[i - ][j], dp[i - ][j - weight[i]] + value[i]);
}
}
cout << dp[m - ][n];
;
}

