有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

动态规划五部曲:

  1. 确定dp数组以及下标的含义

使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

  1. 确定递推公式

不放物品i:
由dp[i - 1][j]推出,即背包容量为j,里面不放物品 i 的最大价值,
此时dp[i][j]就是dp[i - 1][j]。
(当物品i的重量大于背包 j 的重量时,物品 i 无法放进背包中,背包内的价值依然和前面相同。)

放物品i:
由dp[i -1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为
背包容量为j -weight[i]的时候不放物品i的最大价值,
dp[i - 1][j - weight[i]] + value[i](物品i的价值),背包表示放物品i得到的最大价值 。

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i -1][j - weight[i]] + value[i]);

  1. dp数组如何初始化

从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。
状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。
dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

  • 当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。
  • 当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

代码初始化如下:

for (int j = 0 ; j < weight[0]; j++) {  // 如果把dp数组预先初始化为0了,这一步就可以省略。dp[0][j] = 0;
}
// 正序遍历
for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];
}

其他下标初始化
都可!初始化为0更方便

// 初始化 dp
vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];
}
  1. 确定遍历顺序
    都可
  2. 举例推导dp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void bagQues(){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];}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() {bagQues();return 0;
}

动态规划——背包问题01背包相关推荐

  1. 动态规划背包问题——01背包

    2022.7.20         题意概要:有n个物品和一个容量为p的背包,每个物品有重量w和价值v两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量. 在 ...

  2. 动态规划之背包问题——01背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  3. 背包问题——01背包

    背包问题--01背包 01背包作为动态规划(dynamic programing)中最基础的问题,需要我们彻底理解其中的原理,为以后解决更难的动态规划问题打下良好的基础. 这里拟定一个01背包问题: ...

  4. 算法模板:动态规划之01背包【沈七】

    算法模板:动态规划之01背包 前言 动态规划 01背包 二维背包 一维优化 经典习题 小A点菜 5 倍经验日 买干草 完结散花 参考文献 前言 唤我沈七就好啦. 动态规划 核心作用:优化 当数据范围& ...

  5. C++ 背包问题——01背包

    由于编辑器原因,01背包文章搬家了,想看到更好的01背包问题题解,请点击链接: C++背包问题--01背包_小天狼星_布莱克的博客-CSDN博客

  6. 动态规划之背包问题---01背包---完全背包---多重背包

    本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...

  7. 动态规划之背包问题 01背包

    什么是01背包? 有n件物品和一个最多能背重量为w 的背包.第i件物品的重量是weight[i],得到的价值是value[i] .每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大. 首先, ...

  8. 算法-动态规划(01背包)

    最近闲来无事,学学算法. 什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度,因 ...

  9. 【动态规划】01背包:P1060 开心的金明

    01背包: 容量为N,重量为v[i],价值为v[i]*w[i] [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> ...

最新文章

  1. mac gource_如何使用Gource显示项目的时间表
  2. MySQL 常见操作指令
  3. 简约而不简单|值得收藏的Pandas基本操作指南
  4. linux怎么取消raid磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
  5. python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?
  6. AJAX Control Toolkit——DropShadow(阴影和圆角框)
  7. 微软认知服务应用秘籍 – 与机器人聊知识
  8. hibernate 封装 2008-11-12 17:21 (分类:默认分类)
  9. java成员变量覆盖_java-成员变量的属性与成员函数的覆盖
  10. 订单同步工程标准化改造事记
  11. 《Python学习手册第4版》PDF源代码+《流畅的Python》PDF思维导图
  12. JavaScript学习之面向对象编程-04
  13. 网络工程师的python之路-FTP备份配置文件
  14. matlab 多项式相减,matlab多项式计算与数据处理
  15. 【频率计】基于FPGA的频率计设计
  16. C++批量修改文件后缀名(提供多种方法)
  17. 【CCNP | 网络模拟器GNS系列】安装、配置和使用 GNS3
  18. 《Java 并发编程实践》导图笔记
  19. Linuxprobe,红帽linux网络课程学习贴 -17
  20. 注册交管12123服务器异常,交管12123提示服务异常怎么解决

热门文章

  1. 【时间之外】数据中台建设要点
  2. 人类投资者VS人工智能,究竟谁会胜出?
  3. 关于节日文化的HTML网页设计-----二十四节气
  4. 图像处理(三)——中国传统工艺画风格的图像转换应用
  5. 天天爱跑步【NOIP2016 T4】
  6. 作为一个精神病人是一种怎样的体验?
  7. 普通用户使用su无法切到root用户的解决方法
  8. 如何利用Flashback Query 恢复误删除的数据
  9. 线索二叉树的线索化、及遍历
  10. silvaco 仿真BJT