算法设计 - 01背包问题

news2024/11/28 22:52:25

学习来源

【自制】01背包问题算法动画讲解_哔哩哔哩_bilibili

问题描述

有N件物品,第i件物品的重量是w[i],价值是p[i]。

有一个背包,背包的承重是W。

求解:将哪些物品装入背包可获得最大价值。

实例说明

有如下物品,给定每件物品的重量和价值:

物品重量价值
葡萄23
矿泉水35
西瓜46

有一个背包,承重是6。

请求出背包放入物品的最大价值。

01背包解题思路

01背包是基于动态规划解题的。

即将对承重6的背包的装载最大价值问题的求解,分解为对更小承重的背包的装载最大价值问题的求解。当分解到背包承重只有0时,就可以轻易得到背包装载最大价值为0。

同时,我们还需对物品的选择进行分解,将对多种物品的选择,分解更少种物品的选择,直到选择物品为0时,无论什么背包的装载最大价值都是0。

因此,我们可以得到一个二维矩阵图如下:

其中:

  • 第0列表示背包承重为0,此时装不了任何物品,因此此背包的装载最大价值都为0。
  • 第0行表示背包不选择任何物品放入,因此无论什么背包,装载价值都为0。

我们可以用dp二维数组来表示,行用i变量表示,列用j变量表示,因此:

  • dp[i][0] = 0
  • dp[0][j] = 0 

而dp[i][j]表示的含义是:背包承重为 j 的时候,选择物品范围 0~i 时,可以产生的最大价值。

下面我们讨论:背包承重为1时,只选0~1范围的物品,所能产生的最大价值,即求解dp[1][1],如下图标黄处所示

此时,我们有两种选择:

  • 不选择第1行物品(即葡萄),只选择前面的物品,此时相当于 dp[1][1] = dp[0][1]
  • 选择第1行物品(即葡萄),但是由于葡萄重量为2 > 背包承重1,因此选不了,因此还是相当于 dp[1][1] = dp[0][1]

最终dp[1][1] = dp[0][1],

此时似乎还看不出状态转移方程,我们继续往后推导

 接下来,我们扩大背包承重,即背包承重为2,此时依旧两种选择:

  • 不选择第1行物品(即葡萄),只选择前面的物品,此时相当于 dp[1][2] = dp[0][2]
  • 选择第1行物品(即葡萄),但是由于葡萄重量为2 = 背包承重2,因此可以选。接下来就是关键点了,背包装了葡萄后,还剩下0承重,那么0承重可以装什么呢?请看下面绿色标记

我们发现,背包承重0时,不选葡萄的话(因为葡萄已经装入背包了,现在在讨论剩余承重的最大价值) 的最大价值是0。

因此,选了背包承重2,选了葡萄后能产生的最大价值为 3 + dp[0][0] = 3 + 0 = 3

而前面背包承重2,不选葡萄后能产生的最大价值继承自dp[0][2] = 0,

因此我们肯定选择装入葡萄,产生最大价值3。

之后同理:背包承重3

如果不装葡萄,则最大价值继承自dp[0][3] = 0,

如果装入葡萄的话,葡萄产生价值3,剩余背包承重1,不选葡萄,能产生的最大价值为dp[0][1] = 0,因此装入葡萄的最大价值为3+0 = 3,

对比来看,背包承重3,装入葡萄产生的价值最大为3。

之后同理退出:背包承重4,5,6是否装入葡萄的最大价值

 

下面继续扩大物品的选择,将矿泉水纳入选择范围,然后继续从背包承重1开始讨论:

背包承重1:

如果不选择矿泉水,那么产生的最大价值,继承自dp[1][1] = 0

如果选择矿泉水,则因为承重不够,装不了,因此也继承dp[1][1] = 0

背包承重2:

如果不选择矿泉水,那么产生最大价值,继承自dp[1][2] = 3 

如果选择矿泉水,则因为承重不够,装不了,因此也继承dp[1][2] = 3

背包承重3:

如果不选择矿泉水,那么产生最大价值,继承自dp[1][3] = 3 

如果选择矿泉水,则承重刚好,矿泉水价值5纳入,剩余承重0,选择不含矿泉水的物品的最大价值为dp[1][0] = 0,因此最后价值为 5 + 0 = 5

对比来看,选择矿泉水的最大价值更大。

背包承重4同理。

 

我们来看看背包承重5:

如果不选择矿泉水,那么最大价值继承自dp[1][5] = 3

如果选择矿泉水,那么纳入矿泉水价值5,还剩余2承重,而2承重,不选矿泉水对应的最大价值为dp[1][2] = 3,因此总价值为8

对比来看,选择矿泉水的价值最大

 

 

按此规则可以推导处后面所有dp

 

状态转移方程

首先 dp[i][j] 表示:承重为 j 的背包,选择 0~i 范围的物品装入的最大价值。

其中 dp[i][0] = 0,dp[0][j] = 0

如果 i !== 0 && j !== 0,则

 dp[i][j] = Math.max(dp[i-1][j],   p[i] + dp[i-1][j - w[i]] )

状态转移方程中

  • dp[i-1][j] 表示 不选择物品 i 能产生的最大价值
  • p[i] + dp[i-1][j - w[i]] 表示  选择物品 i 后纳入了物品 i 的价值p[i],剩余承重为 j - w[i],其中w[i]是物品 i 的重量,而由于我们已经选择了物品 i ,因此剩余承重 j - w[i] 只能选择0~i-1范围物品,对应的最大价值为 dp[i-1][j - w[i]]

当然有一个优化动作就是:

如果背包承重放不下物品 i ,则该承重背包,只能从 0~i-1范围内选择商品,即直接继承dp[i-1][j]。

因此完整的状态转移方程为:

dp[i][0] = 0,
dp[0][j] = 0,
if(w[i] <= W) {
	dp[i][j] = Math.max(dp[i-1][j],   p[i] + dp[i-1][j - w[i]] )
} else {
	dp[i][j] = dp[i-1][j]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚医通-MyBatis-Plus:条件查询Wapper(五)

&#xff08;1&#xff09;MyBatis-Plus&#xff1a;条件查询 实现对数据库复杂的条件操作&#xff1a; Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &…

【文献研究】车辆路径问题静态合作博弈的数学模型及算法实现

前言&#xff1a;以2015年发表在期刊《MATHEMATICAL GAME THEORY AND APPLICATIONS》上的文章《Strong Coalitional Equilibrium in a Transportation Game》为学习资料&#xff0c;学习关于车辆路径模型的合作博弈。以下是本人对文献内容的一些粗浅理解&#xff0c;由于本人英…

linux批量操作文件命令总结

总结下常用的linux命令&#xff0c;linux下的命令组合着实强大。有时候即便是使用的windows系统也可以在Dos窗口下使用linux下的一些命令工具&#xff0c;完成一些文本日常处理。 查找所有文件 find ./ -name "*.log" 查找某一后缀的文件并删除 find ./ -name &qu…

shell篇---运行python,单个或多个

shell运行python1、方法1在shell中利用export指定python解释器路径2、方法2利用conda激活虚拟环境&#xff0c;进入文件执行目录执行3、多个python&#xff08;具体例子&#xff09;4、具体例子code启动查看1、方法1 在shell中利用export指定python解释器路径 编写如下run.sh…

H5页面转微信小程序(web-view)

效果 先放效果让大家看一下吧&#xff0c;过程很简单。 H5页面图 小程序预览图 准备工作 注册一个小程序&#xff08;一定得是企业认证账号&#xff0c;个人账号无法使用web-view&#xff09;&#xff0c;具体注册就不演示了。 国内的备案域名&#xff08;你H5页面和后台…

SpringMVC学习:二、SSM整合

3. SSM 整合 3.1 需求 使用SpringMVC和MyBatis完成用户管理系统. 3.2 整合思路 springspringmvcmybaits的系统架构&#xff1a; 步骤: 第一步&#xff1a;整合dao层 ​ mybatis和spring整合&#xff0c;通过spring管理mapper接口。 ​ 使用mapper的扫描器自动扫描mapper接口在…

C++ Win32程序编写入门

翻译&#xff1a;原文地址 一、关于Win32 ​ 本文档描述了Win329.1版的功能。若要下载Win32的程序清单&#xff0c;可以点击这里。 Win32是一个用于构建windows应用程序的C库。Win32是MFC的免费替代品。它还有一个额外的优势&#xff0c;即能够在各种免费编译器上运行…

第五章. 可视化数据分析图表—常用图表的绘制5—多个子图表

第五章. 可视化数据分析图 5.3 常用图表的绘制5—多个子图表 Matplotlib可以实现在一张图上绘制多个子图表&#xff0c;Matplotlib提供了三种方法&#xff1a;一是使用subplot函数&#xff0c;二是使用subplots,三是使用add_subplot函数 subplot方法和add_subplot,定制效果比较…

难受啊,139天备战字节跳动,一个疏忽让我前功尽弃...

面试是走的内推途径&#xff0c;因为内推的简历通过率远高于其他方式;我的内推的途径有&#xff1a;联系我在字节跳动工作的一个大学学长。 在线面试&#xff0c;有个线上文本编辑器&#xff0c;类似leetcode那种&#xff0c;可以在线编程。然而有点紧张&#xff0c;视频面试网…

Excel·VBA文件重命名

目录获取文件夹下所有文件名获取文件夹下所有文件名并重命名简体/繁体文件名重命名获取文件夹下所有文件名 Sub 测试代码()Dim i&, j&file_path "E:\测试\重命名"With CreateObject("Scripting.FileSystemObject")For Each f In .GetFolder(file…

字节面试官:Rocketmq如何测试?看看我的回答能拿几分?

字节面试&#xff1a;RocketMQ是怎么测试的呢&#xff1f; 答&#xff1a; 首先保证消息的消费正确、设计逆向用例&#xff0c;在验证消息内容为空等情况时的消费正确性&#xff1b; 推送大批量MQ&#xff0c;通过Admin控制台查看MQ消费的情况&#xff0c;是否出现消费假死、…

磨金石教育兴趣技能分享||分享摄影中的“留白”艺术

老子讲&#xff1a;“虚实相生&#xff0c;有无相形”&#xff0c;有与无相对相衬。一幅画的留白可以看出画家胸中的沟壑&#xff0c;也可以看出作品境界的高下。 从某种层面上来讲&#xff0c;摄影也是作画的艺术&#xff0c;一张艺术感高的照片&#xff0c;也需要懂得留白。…

非零基础自学Golang 第2章 安装和运行Go 2.3 在Linux 下安装Go 2.4 在Mac OS 下安装Go

非零基础自学Golang 文章目录非零基础自学Golang第2章 安装和运行Go2.3 在Linux 下安装Go2.4 在Mac OS 下安装Go第2章 安装和运行Go 2.3 在Linux 下安装Go 由于Linux有众多发行版本&#xff0c;笔者这里以 CentOS 7作为示例进行安装介绍&#xff0c;其他发行版本请参考相关发…

C++ Reference: Standard C++ Library reference: Containers: map: cbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/cbegin/ 公有成员函数 <map> std::map::cbegin const_iterator cbegin() const noexcept;返回指向开始的const_iterator 返回指向容器第一个元素的const_iterator。 const_iterator是指向const内容的…

带你领略python魔法~免费复制文档数据

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 我们百度搜索一些东西得时候&#xff0c;经常找到文档里面 然后就会发现需要充值才能复制&#xff01;怎么可以不花钱也保存呢&#xff1f; 今天就分享给大家一个python获取文档数据得方法 环境使用: python 3.8 pycharm…

DolphinScheduler 发布 3.0.3 版本,重点修复 6 个 Bug

点亮 ⭐️ Star 照亮开源之路https://github.com/apache/dolphinscheduler近日&#xff0c;Apache DolphinScheduler 发布了 3.0.3 版本。此版本主要基于 3.0.2 版本进行了 Bug 修复&#xff0c;共计修复 6 个 Bug&#xff0c;以及 3 处文档修改。其中的较为重要的 Bug fix 为…

外汇天眼:WTI原油自低位累计反弹9%!欧佩克呼吁“警惕和谨慎”

美国CPI增速创近一年来新低&#xff0c;美元指数失守104.0 周三&#xff08;12月13日&#xff09;公布的美国11月CPI同比增长7.1%&#xff0c;不及预期增长7.3%&#xff0c;前值7.7%&#xff1b;美国11月CPI环比增长0.1%&#xff0c;不及预期增长0.3%&#xff0c;前值0.4%。 从…

专访AliceBob的CEO兼联合创始人:深入探知猫态量子比特

&#xff08;图片来源&#xff1a;网络&#xff09; Alice&Bob公司是一家使用cat量子比特制造容错量子计算机的公司。近日&#xff0c;Alice&Bob的CEO兼联合创始人Thau Peronnin&#xff08;以下简称T&#xff09;接受了记者Yuval Boger&#xff08;以下简称Y&#xff…

Java#37(反射)

目录 一.反射的作用和关键 二. 反射获取对象 1.反射获取类对象 2.反射获取构造器对象 3.反射获取成员变量对象 4. 反射获取方法对象 5.用反射绕过编译阶段为集合添加数据 反射做通用框架 一.反射的作用和关键 作用: 反射是在运行时获取类的字节码文件对象: 然后可以解…

未能加载文件或程序集XXX.dll,程序启动失败的解决方案

之前在VS2019上下载一个项目&#xff0c;运行后就报错&#xff0c;弹出 出错&#xff1a;未能加载文件或程序集XXX.dll 我们选中该dll&#xff0c;右键&#xff0c;属性&#xff0c;发现 该dll被锁定 点击“解决锁定”即可解决。 为了一劳永逸解决此问题&#xff0c;后到微软…