当前位置: 首页 > news >正文

背包问题理解思路(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 爬虫工程师,我可以分享一些我在面试中的经验和建议。 首先一点是在面试中要表现自信、友好、乐于合作,同时对公司的业务和文化也要有一定的了解和兴趣,这些也是公司在招聘中看重的因素。 文章目录&#x1f55b…...

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模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 用户可以更加结构图&#xff0…...

数据分析-深度学习 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/ 网上的破解版一般分为两种,一种是直接…...

基于zookeeper的Hadoop集群搭建详细步骤

目录 一、一些基本概念 二、集群配置图 三、Hadoop高可用集群配置步骤 1.在第一台虚拟机解压hadoop-3.1.3.tar.gz到/opt/soft/目录 2.修改文件名、属主和属组 3.配置windows四台虚拟机的ip映射 4.修改hadoop配置文件 (1)hadoop-env.sh (2)workers (3)crore-site.xml …...

职称有哪些意义?如何提升职称?

每年我们会看到很多人都会努力地提升自己的职称,那么为什么大家都想要晋升职称?在这里余老师说说他的作用,您可以参考一下。 一、个人金钱方面的提升 工资。职称直接关联的就是涨工资了。正常情况下,职称和工资是一一对应的了,…...

mulesoft MCIA 破釜沉舟备考 2023.02.15.09

mulesoft MCIA 破釜沉舟备考 2023.02.15.09 1. According to MuleSoft, which deployment characteristic applies to a microservices application architecture?2. Refer to the exhibit.3. Mule application A receives a request Anypoint MQ message REQU with a payload…...

【项目实战】@ConditionalOnProperty注解让我少写了一些if判断

一、需求说明 本机启动含有XXL-job的工程,发现每次都会进行XXL-job的init的动作。这会导致本机每次启动都会把自己注册到XXL-job的服务端。但是我明明本地调试的功能不想要是编写定时任务,于是想了下,是否可以设计一个开关,让本机…...

SQL中的游标、异常处理、存储函数及总结

目录 一.游标 格式 操作 演示 二.异常处理—handler句柄 格式 演示 三.存储函数 格式 参数说明 演示 四.存储过程总结 一.游标 游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、…...

Splashtop:支持M1/M2芯片 Mac 电脑的远程控制软件

M1和M1芯片的Mac电脑现在越来越多了。M1和M2的强大性能,让使用者们办公、娱乐如虎添翼。 M1 芯片于2020年11月11日推出,是Apple 首款专为Mac打造的芯片,拥有格外出色的性能、众多的功能,以及令人惊叹的能效表现。M1 也是Apple 首款…...

实验十三、阻容耦合共射放大电路的频率响应

一、题目 利用 Multism 从以下几个方面研究图1所示的阻容耦合共射放大电路的频率响应。图1阻容耦合共射放大电路图1\,\,阻容耦合共射放大电路图1阻容耦合共射放大电路(1)设 C1C210μFC_1C_210\,\textrm{μF}C1​C2​10μF,分别测试它们所确定…...

【每天进步一点点】函数表达式和函数声明

函数声明 function 函数名(){} 函数声明会被率先读取。 函数声明后不会立即执行,会在我们需要的时候调用到。 由于函数声明不是一个可执行语句,所以不以分号结束。 函数表达式 表达式赋值给了一个变量 const 变量名 functi…...

JavaScript void

文章目录JavaScript voidjavascript:void(0) 含义href"#"与href"javascript:void(0)"的区别JavaScript void javascript:void(0) 含义 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么…...

笔记本电脑怎么连接无线网wifi?不同电脑系统的使用教程(2023最新)

现在越多人使用笔记本电脑,在我们的日常生活和工作中是很难离开它的。想要更快速地上网,我们都会选择连接无线网的wifi。有时笔记本电脑无法连接网络,你知道这是什么原因吗?笔记本电脑怎么连接无线网wifi?方法很简单&a…...

wordpress 主题 保存/人工智能培训班收费标准

树的遍历 Description 给定某二叉树的前序序列和中序序列&#xff0c;输出该二叉树的后序序列。&#xff08;输入的前序遍历和中序遍历的结果中都不含重复的数字&#xff09; 第一行是n 接下来一行有n个数表示前序序列 最后一行是中序序列 对于30%的数据&#xff0c;n<20…...

wordpress古文主题/培训机构网站

JVM 内部原理&#xff08;六&#xff09;— Java 字节码基础之一 介绍 版本&#xff1a;Java SE 7 为什么需要了解 Java 字节码&#xff1f; 无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户&#xff0c;Java 字节码都在你面前&#xff0c;它是 Java 虚拟机的基…...

2023年免费进入b站/免费域名注册平台有哪些

学习web编程的方法&#xff1a;1、学习html和css&#xff1b;2、学习javascript&#xff1b;3、了解web服务器&#xff1b;4、学习一门服务器端脚本语言&#xff1b;5、学习数据库及SQL语法&#xff1b;6、学习web框架。如何学习web开发&#xff0c;需要掌握哪些方面&#xff1…...

wordpress手机客户端开发教程/站长工具的使用seo综合查询运营

最近两周由于忙于个人项目&#xff0c;一直未发言了&#xff0c;实在是太荒凉了。。。。&#xff0c;上周由于项目&#xff0c;见到Python的应用极为广泛&#xff0c;用起来也特别顺手&#xff0c;于是小编也开始着手学习Python,…下面我就汇报下今天的学习成果吧 小编运行环境…...

中线企业网站建设的问题/哪里的网络推广培训好

http://my.oschina.net/goal/blog/195749?p1 目录[-] 写在前面的话什么是字节序MSB和LSB大端序小端序网络字节序主机字节序总结pack/unpack详解格式字符翻译格式字符详解unpack的用法一些例子PHP作为一门为web而生的服务器端开发语言&#xff0c;被越来越多的公司所采用。其中…...

网站搭建 保定/搜索百度网址网页

作说明及PC端控制软件https://share.weiyun.com/5HFmWGl或https://pan.baidu.com/s/1SXz5BsYJiAF-eUpFG_2l-g 提取码: kixh或https://drive.google.com/open?id1-JViWLBOIzaHTdwdONX2RP8S4EgWxoNDDIY的矢量网络分析仪&#xff0c;参考了日本edy555的相关设计,修改了部分电路&a…...