动态规划之01背包问题思路详细讲解
创作时间:
作者:
@小白创作中心
动态规划之01背包问题思路详细讲解
引用
CSDN
1.
https://m.blog.csdn.net/2301_81811979/article/details/136750429
01背包问题定义
01背包问题是指:有n种重量或价值不同的物体,每种物体只有1个。使用一个容量为m的背包去装这些物体,问能装到的最大价值为多少?
样例说明
假设我们有以下物品:
物品编号 | 重量 | 价值 |
---|---|---|
1 | 1 | 15 |
2 | 3 | 20 |
3 | 4 | 30 |
背包容量为4。
动态规划解法
1. DP数组的含义
dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少 。
i,j,以及dp[i][j]所存的值便包含了每个物体,背包容量,而物体的重量与价值也间接的与j,dp[i][j]挂钩。
2. 确定递推公式
以本例的最终值dp[2][4]为例,首先以物品二的上面几行为基准,他们表示在下标为【0到1】的物品中对应不同j值是取得的最大值,但本体最终是要扩充到下标为【0到2】的物品中去,所以我们可以得到如下表达式:(因为dp数组中i的定义为[0到i],并不是说第i行就必须会被选中,所以此时物体2便有两种状态)
- 不放物品2 :dp[2][4] 由dp[1][4]推出,即背包容量为4,里面不放物品2的最大价值,此时 dp[2][4] 就是dp[1][4]。其实就是a.当物品i的重量大于背包j的重量b.单纯不装(后面代码中会有相应对应点)时,物品i无法放进背包中,所以背包内的价值依然和前面相同。
- 放物品2 :由dp[1][0]]推出,dp[1][0]+value[2]为背包容量为0的时侯放物品2的最大价值,那么dp[1][0]]就是背包放物品2得到的价值
递推公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
3. 确定dp数组的初始值以及遍历顺序
由dp数组的定义可得到第一行的每个值,很好理解,第一列也可视为放不下物品i是由递推式dp[i - 1][j]得到,因为背包容量为0真的装不下
遍历顺序:因为由上述分析得下一行总由上一行得出,所以我们一行一行来递推,直到最后一行,得到最后一格对应得最终值
for(int i = 1; i < weight.size(); i++) { // 遍历物品
for(int j = 0; j <= bagweight; j++) { // 遍历背包容量
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]);
}
}
4. 最终代码
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>(bagweight + 1, 0));
// 初始化
for (int j = weight[0]; j <= bagweight; j++) {
dp[0][j] = value[0];
}
// weight数组的大小 就是物品个数
for(int i = 1; i < weight.size(); i++) { // 遍历物品
for(int j = 0; j <= bagweight; j++) { // 遍历背包容量
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]);
}
}
cout << dp[weight.size() - 1][bagweight] << endl;
}
int main() {
test_2_wei_bag_problem1();
}
最后解释的一点:因为每一步递推的上一步已经求得了最大值,所以最后一定为最大值板上钉钉
热门推荐
做完果酸焕肤后如何护理?
双鱼座男生性格特点与致命弱点:温柔背后的挑战
《食品感官》课件-味觉敏感度测试
重点关注!USnews2025美国大学排名三大变化
包牙冠后牙龈肿痛怎么办?六大原因及应对策略全解析
新一代大驱引领21世纪,领先055至少1.5代
核医学工作人员辐射防护的秘密武器
如何学绘画?零基础学习绘画教程!
成组工艺是什么?成组工艺如何提升生产效率?成组工艺的应用场景有哪些?
柏拉图的《申辩篇》:为生命而受审,苏格拉底哲学的一生
农历七月廿二,民间讲究“拜财神”,记住:3做,3不做,接财纳福
非黑即白,波斯神话世界
通货膨胀的背后原因、影响与对策
《哪吒2》何以大火?成为春节档现象级动漫影片?
打通小周天,从根源上解决疾病,打通很容易但是一定注意这点
违章停车罚款怎么缴?多种网上缴纳方式详解
二十图读懂七七事变的真相
生蚝的功效与作用:营养专家权威解读
小时候经常喝牛奶,长大会引发痤疮吗
高效电解水制氢方案
恩施至四川的交通距离与出行指南
加息风云录:揭秘中央银行如何驾驭经济航船,影响你我生活
小学三年级作文批改技巧:怎么给小学生改作文才能事半功倍?
提升睡眠质量:11个减少夜间辗转反侧的实用建议
我国有多少座故宫,个个实力不俗,不仅仅是北京的故宫博物院
拔牙后第2天能说话吗?专家解读术后注意事项,让你安心恢复
教师停薪留职的条件及规定
苏东坡与西湖景观的营造
新晋“央视一姐”龙洋:4次主持春晚,背后的家庭再也藏不住了
一文讲清楚 “电路反馈”