一.问题描述
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大
二.思路分析
根据动态规划五部曲进行分析
1)确定dp数组
使用二维dp数组dp[i][j]代表的含义是当背包容量是j时从物品0-i选取出价值最大组合
2)确定递推公式
1.背包容量j不够物品i放入 dp[i][j] = dp[i-1][j]
2.背包容量j足够物品i放入 dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]] + vaule[i])
3)dp数组初始化
1.i = 0时 当背包容量j < weight[0]初始化为0
当背包容量j > weight[0]初始化为value[0]
2.j= 0时 初始化为0
4)确定遍历顺序
从上至下从左至右(对每个背包容量遍历一遍物品)
5)举例数组
三.代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
void test_2_wei_bag_problem1()
{
vector<int> weight = { 1, 3, 4 };
vector<int> value = { 15, 20, 30 };
int bagweight = 4;
vector<vector<int>>dp(weight.size(),vector<int>(4+1,0));
for(int j = weight[0];j <= bagweight;++j)
{
dp[0][j] = value[0];
}
for(int j = 1;j <= bagweight;++j)
{
for(int i = 1;i < weight.size();++i)
{
if(j < weight[i])
{
dp[i][j] = dp[i - 1][j];
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
}
}
for(auto i : dp)
{
for(auto j : i)
{
cout << j<<" ";
}
cout << endl;
}
}
int main()
{
test_2_wei_bag_problem1();
}