题目:
背包的最大重量为 4,有3件物品,物品对应的重量和价值为:
weight = { 1, 3, 4 };
value = { 15, 20, 30 };
将哪些物品装入背包里的物品价值总和最大。
// 完整代码
void test_2_wei_bag_problem1()
{
vector<int> weight = { 1, 3, 4 }; // 物品重量
vector<int> value = { 15, 20, 30 }; // 物品价值
int object = 3; // 物品数量
int bagWeight = 4; // 背包容量
// 定义 dp 数组
vector<vector<int>> dp(object, vector<int>(bagWeight + 1, 0));
// 初始化
// j = 0 的情况就是 0,相当于在定义时就已经初始化了
// 易出错点一::终止条件处
for (int j = bagWeight; j >= weight[0]; j--)
{
// 这里初始化有两种写法,都可以的,第二种是为了呼应接下来学习的滚动数组
//dp[0][j] = value[0];
dp[0][j] = value[0] + dp[0][j - weight[0]];
}
// 遍历 dp 数组
for (int i = 1; i < object; i++) // 遍历物品
{
for (int j = 1; j <= bagWeight; j++) // 遍历背包容量
{
// 易出错点二::终止条件处
// // 判断的方法一:这里的判断条件忘记了!!!!!!!!
if (j < weight[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], value[i] + dp[i - 1][j - weight[i]]);
// // 判断的方法二:
//if (j - weight[i] >= 0)
// dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
cout << dp[i][j] << " ";
}
cout << endl;
}
}
int main()
{
test_2_wei_bag_problem1();
return 0;
}