背包问题理解思路(01背包、完全背包、分组背包)
这两天把经典的三个背包问题看了一下,网上大多文章是以代码和公式为主,因为平时没刷过算法题所以理解起来花了些时间,固写一篇文章记录理解思路,本文不包含代码实现(理解了思路代码实现应该是小问题,网上一搜一大把,主要是思路!思路!思路!)
一、三个背包问题概述
因为三个背包问题实际上解决思路是几乎相同的,所以这里把三个问题放到一起进行记录,首先简单说下三个背包问题的题干
1.01背包问题:即有数件物品,每样物品均有不同的价值和重量,先给定一个背包容量大小,求背包能装下的最大价值。
2.完全背包问题:在01背包问题的基础上,每样物品有无限个(即可重复装包),求背包能装下的最大价值。
3.分组背包问题:在01背包问题的基础上,把数样物品改为数组物品,每组物品中只能选择一件,求背包能装下的最大价值。
二、动态规划及整体解题思路
个人理解动态规划简单来说就是对于当前状态,是某个过去状态的迭代结果,状态不断回溯存在一个初始固定状态并可以根据它推导出全部未来状态的一种模型,比如比较好理解的例如阶梯问题:漫画:什么是动态规划? - 知乎———————————— 题目: 有一座高度是 10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可…
https://zhuanlan.zhihu.com/p/31628866
每一层台阶n层的走法数量是n-1层和n-2层决定的,即n层走法数等于n-1层的走法数加上n-2层的走法数之和,然后一直反推到第1(一种走法)层台阶和第2(两种走法)层台阶两个走法数确定的状态,即可推算出后续每一层台阶的走法数。
背包问题依然是使用这样的思路去解决问题,但对于背包问题来说比阶梯问题多了一个维度,是一个二维递归,理解起来相对来说会困难一点,在下文中会详细讲解图解思路,这里只对大概思路做一个说明:01背包中假设背包容量为10、物品中有一个物品容量占用为2价值任意的物品,那么对于该物品是否放入背包的问题取决于背包装到占用为8(即10-物品占用空间)时除该物品外其他全部物品装包方案的最大价值加上该物品的价值与除该物品外其他全部物品装满背包时的最大值做一个比较,价值总量最高的即为价值最大化方案,同样对于完全背包问题,只需要在01背包问题的基础上做一点点改动,对于10容量的状态只需要占用为8时全部物品装包方案的最大价值加上该物品的价值与除该物品外其他全部物品装满背包时的最大值做一个比较,价值总量最高的即为价值最大化方案,而分组背包问题只需要在01背包的基础上在把物品换乘组物品,并在每次比大小的时候循环对比组内全部物品大小即可,上述理解思路只是一个便于理解的大概思路,并不完全准确,因为物品是一件一件放入的,比较的过程也是动态的,接下来将对三个背包问题逐一图解,更加直观的解释解题思路。
三、01背包问题详解

首先看上图,其中j轴表示背包容量大小,i轴表示物品,每一列都表示将每个物品依次尝试放入背包后状态的最大值,很显然我们可以得出如上图所示的这些初始状态格,当背包容量为10时我们需要的最大价值就是L6单元格的值,现在要做的就是根据上文中的比较方案进行逐一对比就能填充完全部单元格了,即对比占用为(j-物品占用空间)时除该物品外其他全部物品装包方案的最大价值加上该物品的价值与除该物品外其他全部物品装满背包时的最大值,由于我们的表格中放入物品是线性的,即有顺序的,因此比较中的除该物品外其他全部物品在每一步上时指根据i轴顺序该物品放入之前放入的其他全部物品(即i-1),这样只需要将数据推到第6行即是每个容量时的最大价值了,现在根据这个对比方式我们推一下E3单元格的值,此时j轴即背包容量为3,因此很容易知道我们仅仅需要去比较E2单元格的值和(B2单元格的值+4),取较大的即可,此时我们的表格变成了这样

接下来发现存在E4这种单元格,它的(j-物品占用空间)超过了表格左象限,换句话说该j轴的情况下该物品还无法放入背包,因此在取最大值中直接取(i-1)的值即可,下面我们来根据规则将全部格子的值推导出来

即最大价值为19。
总结一下每个格子的状态公式,现在把每个物品的空间设为w,价值设为v,每个格子的值设为d,那么每个格子的公式(不考虑E4这种边界条件的情况下)为:d[i][j] = max(d[i-1][j], d[i-1][j-w[i]] + v[i])。
四、完全背包问题详解

我们依然以该模型为例,为了让过程更容易理解,我们把性价比最高的物品放到最下一行,其中初始状态值很明显有所不同,现在我们推一下E3单元格的值,此时j轴即背包容量为3,与01背包问题不同,因为完全背包问题中物品可以重复拿取,因此E3单元格需要比较的值变成了E2单元格的值和(B3单元格的值+4),根据这个思路我们直接推导出全部单元格数值如下

总结一下每个格子的状态公式,现在把每个物品的空间设为w,价值设为v,每个格子的值设为d,那么每个格子的公式(不考虑E4这种边界条件的情况下)则为:d[i][j] = max(d[i-1][j], d[i][j-w[i]] + v[i]),与01背包差别不大。
五、分组背包问题
分组背包问题思路与01背包基本相同,将i轴换乘物品组,每个格子进行最大值比较时循环将该组的每一个物品都套进01背包的公式中进行一次比较,从代码的角度无非是加了一层循环而已,因此不再进行详细图解及公式推导。
相关文章:
背包问题理解思路(01背包、完全背包、分组背包)
这两天把经典的三个背包问题看了一下,网上大多文章是以代码和公式为主,因为平时没刷过算法题所以理解起来花了些时间,固写一篇文章记录理解思路,本文不包含代码实现(理解了思路代码实现应该是小问题,网上一…...
Mr. Cappuccino的第39杯咖啡——Kubernetes之深入理解Pod
Kubernetes之深入理解PodPod相关概念Pod详细配置清单Pod核心配置Pod基本配置1. 创建yaml文件2. 创建namespace并根据yaml文件创建资源3. 查看namespace下的pod列表以及pod的详细信息Pod中多个容器的名称和端口号不能相同Pod镜像拉取策略Pod环境变量Pod端口相关设置Pod资源相关配…...
SqlSession 和 SqlSessionTemplate 简单使用及注意事项
1、SqlSession 简单使用 先简单说下 SqlSession 是什么?SqlSession 是对 Connection 的包装,简化对数据库操作。所以你获取到一个 SqlSession 就相当于获取到一个数据库连接,就可以对数据库进行操作。 SqlSession API 如下图示:…...
1. QSaveFile和QFile的简单使用
1. 说明 QSaveFile和QFile两个类都是用来操作文件的,区别在于QSaveFile在对文件进行写入时有一种保护机制,再写入出错时,不会对源文件中的内容进行操作。该类在执行写操作时,会先将内容写入到一个临时文件中,如果没有…...
工业4.0是如何优化垃圾处理行业的
如今,工业4.0正在影响着制造业和物流等行业,其发展潜力在未来还有望进一步扩大。一些全球领先的垃圾处理公司已经开始在水处理和废物回收等领域应用工业4.0。工业4.0的创新给这个领域带来了一些必要的改进。随着环境危机的加剧,垃圾处理行业面…...
vue 动画(transition)
一、 实现原理 在插入、更新、移除 DOM 元素时,在合适的时候给元素添加样式类名,配合 CSS 样式使用,实现动画效果。 通俗来讲,就是将要进行动画操作的 DOM 元素用 transition 标签包裹起来。在此html元素运动前,运动…...
Python 爬虫工程师面试经验分享,金三银四
🙃 作为一个 Python 爬虫工程师,我可以分享一些我在面试中的经验和建议。 首先一点是在面试中要表现自信、友好、乐于合作,同时对公司的业务和文化也要有一定的了解和兴趣,这些也是公司在招聘中看重的因素。 文章目录🕛…...
MySQL实战篇-MySQL 降配导致的实例宕机
问题描述 由于近期对服务器进行了降配,该mysql数据库会进行批量写入操作,直接导致实例宕机 查看错误日志: 2021-02-02T09:09:23.557505Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 16791ms. The settings might not be optimal. (fl…...
时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
本文内容整理自 博学谷狂野架构师 动态代理简介 Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 用户可以更加结构图࿰…...
数据分析-深度学习 Tensorflow Day6
我们需要解决的问题:1: 什么是bp 神经网络?2:理解bp神经网络需要哪些数学知识?3:梯度下降的原理4: 激活函数5:bp的推导。1.什么是bp网络?引用百度知道回复:“我们最常用的…...
leaflet 设置多个marker,导出为一个geojson文件(066)
第066个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用L.marker设置多个markers, 通过数据重组,导出为geojson文件。 这里面 ayer instanceof L.Marker 是一个很重要的判断条件,可以灵活地去运用。 直接复制下面的 vue+openlayers源代码,操作2分钟即可…...
企业与第三方供应商合作时,会存在哪些安全风险?
随着现代社会的发展,企业供应链、产业供应链已日渐成熟。其中,供应商与企业的关系也由最初的纯粹买卖关系发展成了合作伙伴关系。在整个供应链体系中,供应商与其受众承担着供应链中环环相扣的责任,可以说,企业安全的薄…...
技术源自洛克希德·马丁,光场XR眼镜FYR解析
专注于医疗场景的一家XR眼镜厂商FYR(全称:FYR Medical)近期亮相,并宣布完成了260万美元A轮融资,本轮融资由NuVasive领投,资金将用于开发世界上第一个XR光场“放大镜”类产品。据青亭网了解,NuVa…...
剑指 Offer 10- II. 青蛙跳台阶问题(LeetCode 70. 爬楼梯)(动态规划打表)
题目: 链接:剑指 Offer 10- II. 青蛙跳台阶问题;LeetCode 70. 爬楼梯 难度:简单 相关博文:剑指 Offer 10- I. 斐波那契数列(动态规划打表) 一只青蛙一次可以跳上1级台阶,也可以跳上…...
webpack(高级)--文件的压缩Terser(js/css/html) Tree Shaking
webpack Terser Terser是一个javascript的解释(Parser),Mangler(绞肉机) /Compressor(压缩机)的工具集 早期我们会使用uglify-js来压缩,丑化我们的javascript代码 但是目前已经不在维护 并且不支持ES6语法 Terser是从uglify-es fork 过来的 也就是说 Terser可以帮…...
做软文发布需要注意哪些细节?
软文发布是一种有效的网络营销和推广活动,它以媒体等形式把产品信息植入到软文报道或新闻中,进行心理暗示和引导销售,进行正面宣传以及促进销售的新型网络营销方式,它不但能够有效地推行产品宣传、也能有效地提高网络曝光率&#…...
【Python】一篇文章读懂yield基本用法
这一次,田辛老师想通俗易懂地解释一下Python中的yield功能。 本文要说明以下四个问题: yield是什么什么是迭代器和生成器yield的基本用法如何使用yield from 用真正简单的方法讲解yield并不容易。 我想,就算你不懂yield语句,也…...
Docker getting started
系列文章目录 Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…...
【Uniapp使用遇到问题合集】
Uniapp使用遇到问题合集问题一跳转页面后无法进行滑动/滚动的操作描述解决方法问题一 跳转页面后无法进行滑动/滚动的操作 描述 如题,实际操作是我在uniapp自带的组件uni-popup弹出层中加入了一个点击事件,点击后可跳转到指定的页面 但实际运行中出现了跳转过后页面过长时无…...
宝塔面板破解最新教程
宝塔,让运维简单高效。面板支持Linux与Windows系统。一键配置:LAMP/LNMP、网站、数据库、FTP、SSL,通过Web端轻松管理服务器。今天考高分网就简单说一下BT宝塔面板专业版最新破解教程。 网地址:https://www.bt.cn/ 网上的破解版一般分为两种,一种是直接…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
