动态规划——背包问题01背包
创始人
2025-05-30 14:47:23
0

在这里插入图片描述
有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> dp(weight.size(), vector(bagweight + 1, 0));
for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];
}
  1. 确定遍历顺序
    都可
  2. 举例推导dp
    在这里插入图片描述
#include 
#include 
#include 
using namespace std;
void bagQues(){vector weight = {1,3,4};vector value = {15,20,30};int bagweight = 4;vector> dp(weight.size(),vector(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<bagQues();return 0;
}

相关内容

热门资讯

SSM项目 创建一个vue工程:cmd: vue create 项目名npm run serve:...
牧原股份回应赴港上市原因:意在... 新京报贝壳财经讯(记者阎侠)5月30日,牧原股份发布投资者关系活动记录表。今年4月,牧原股份的生猪养...
I. 全球变暖(23分)【df... 具体出处蓝桥杯2018年cpp组【第九届】【省赛】【B组】P8662 [蓝桥杯 2018 省 AB]...
三十四、实战演练之接口自动化平... 一、 环境创建 接口名称:/test_envs/ 请求方式:POST 参...
生成式AI为百度打开想象力 出品 | 何玺 排版 | 叶媛 3月16日,备受期待的百度人工智能系统文心一言正式发布...
javaweb实验室学生考勤签... 管理员信息表,包括自动编号,管理员账号,登录密码等数据字段...
提供一种嵌套表单的校验姿势 文章目录一、表单校验1. 代码演示 一、表单校验 表单校验,前端经常遇到的校验场景&...
go语言入门-一文带你掌握go... 前言 本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零...
【Vue3】tinymce富文... 1.简介 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:...
量子计算(10)量子算法2:D...         又到了一周一篇的量子计算啦!全体起立respect! ...
十六、FreeRTOS中如何实... 文章目录1、多任务系统中为什么要引入互斥?2、如何实现互斥访问的3、需要互斥访问内核对...
如何把自有数据接入GPT大模型... ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。 以它为代表的大模型并...
美国中重卡销量10强:福莱纳领... 陌生的美国中重卡市场在我们的一般印象中,全球各国的汽车市场互联互通,应该是大同小异的。无论是是美国、...
Android WebView... 1、不使用WebView缓存 使用场景:通过WebView输入用户名和密码进行登录&#...
阿里云PAI-DeepRec ... 阿里云联合英特尔举办的“创新大师杯”全球AI极客挑战赛——PAI-DeepRec CTR模型性能优化...
拒绝转保!34年编外员工办不了... 临近退休了,突然被强制“自愿转保”,河北井陉县税务局的冯爱文拒绝签字,导致办理不了退休,到底发生了什...
中原证券:A股6月有望延续结构... 展望A股6月行情,中原证券在最新研报中表示,总体而言,6月A股在政策托底与盈利修复的共振下,有望延续...
【C++】类和对象三大特性--... 文章目录1. 多态的基本概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重...
潜在因子模型(Latent F... LatentFactorModelsLatent Factor ModelsLatentFactor...
Java Web 实战 15 ... 文章目录一 . 网络编程中的基本概念1.1 网络编程1.2 客户端(client) / 服务器(se...