动态规划之背包问题:组合优化中的经典NP挑战

背包问题概念:

背包问题是一种经典的组合优化的NP问题,在计算机科学、运筹学等领域有着广泛的应用。

问题可以简单的描述为:

假设有一个容量为C的背包和n个物品,每个物品i都有重量w[i]和价值v[i]。目标是选择一些物品放入背包,使得放入背包的物品总价值最大,同时背包中物品的总重量不能超过背包的容量。

 

 这里先简单介绍两种背包问题:

1.01背包:也就是你物品的个数是1个,你拿了就剩0个,没拿就剩1个

2.完全背包:物品个数无数个,可以拿0/1/2/3/4至无穷多个

背包也可以分两种:1.背包不需要装满。2.背包必须装满

这样两两组合就有4种问题

其实背包问题还有很多种情况,个数有2/3/4/5等等,每个在X2(不必装满||必须装满)

这里重在了解01背包和完全背包问题(其他可能更多出现在竞赛中)

01背包问题是所有问题的基础(基本上所有的背包问题都衍生于01背包)

以牛客网例题为例(leetcode没有较好的入门例题)

题目解析: 

第1小问:背包不必装满问题

第2小问:背包必装满问题

建议画一个表格,而且最好上面标号,就有点像我们之间处理初始化那里一样,多加一行多加一列,有利于我们后面填表

算法原理 :

其实这里的背包问题就是一个线性dp问题,也就是你挑物品时可以从左往右依次选还是不选

类似于我们之前讲解线性dp问题一样去分析即可

1.状态表示:经验+题目要求

经验:以i位置为结尾巴拉巴拉

题目要求:dp[i]:表示以i位置为结尾(从前i个物品中)所有的选法中价值最大的

我们可以发现这个状态表示推导不出来状态转移方程,因为我们在考虑第i个物品的时候,需要考虑这个能不能放进背包,我连总的重量和剩余容量都不知道

所以我们需要改一下状态表示,既然一维表示不了,那我们就二维

dp[i][j]:从前i个物品挑选,总体积不超过j,所有选法中,能挑选出来的最大价值

为什么这里是不超过?因为我们做第一小问,问题是不需要装满

2.状态转移方程:以最近的一步状况,划分情况

1.不选i物品,不选的话是不是最大价值就在i-1前,回归我们的状态表示

dp[i-1][j]:从前i-1个物品挑选,总体积不超过j,所有选法中,能挑选出来的最大价值 

那这种选法中dp[i][j]=dp[i-1][j]

2.选i物品,选的时候是不是要考虑能不能装进背包,所以我们需要判断背包剩余容量

剩余容量就是j-v[i]

如果剩余容量小于0,那这个i物品肯定是不能选的

如果剩余容量大于等于0,这个i物品就可以选,怎么选,回归状态表示

是不是你自身的价值加上i-1的最大价值

所以综上,最大价值就是这两种选法中最大的那个

第2小问讲解:

这里只需要稍加修改一下状态表示即可

原: dp[i][j]:从前i个物品挑选,总体积不超过j,所有选法中,能挑选出来的最大价值

现:dp[i][j]:从前i个物品挑选,总体积正好等于j,所有选法中,能挑选出来的最大价值

基本是一样的,但我们需要特别注意:我们用dp[i][j]=-1,表示没有这种情况,就是所有的选法无法凑到刚好总体积等于j的情况

那为什么不等于0呢?因为如果等于0,我们就无法区分dp[i][j]=0时表示什么情况,我们之前做第一问的时候就有初始化为0,为了区分这两种情况,我们把凑不出总体积为j的情况设为-1

第一种情况不选i物品,可以不用判断dp[i-1][j]!=-1,因为我不选i物品,dp[i-1][j]都等于-1,那证明你凑不出来,那dp[i][j]也凑不出来,所以这时候的dp[i][j]=dp[i-1][j];

第二种情况,选i物品,就必须要判断dp[i-1][j-v[i]] :也就是你必须要判断你前面的必须要凑出来j-v[i]的体积,因为你dp[i][j]这个位置选i物品要加体积v[i]的,所以你前面要能凑出来,这时候在加上v[i]的体积就刚刚好

初始化:明确第一行第一列表示啥,第一行我从0个物品中选还是不选凑出体积为0/1/2/3

第一列我选不选0/1/2/3/4物品,凑0体积,那就说明都不选,价值就是0,为了方便,我们只要创建dp表的时候初始化第一行为-1即可

后面的都和第一小问一模一样了

 

优化 :

第一种方法:滚动数组的方法,我们可以发现我们的状态转移方程仅仅需要两行的数组

也就是我们在填这一行的数据时,仅仅需要上一行的数据

例如我们在填写第一行数据时,仅仅需要第0行的数据,那我们填第2行时,就可以把第0行滚动下来充当第2行

 

如果你还觉得两行数组很麻烦,当然也可以用一行数组,

但需要注意你的填表顺序要从右往左

如果你是左往右,你填表的时候需要借助左上角的值,那左往右就是覆盖,填右边的时候就出错

这里运用的原理就是覆盖,你的数组原来是有数据的,也就是上一行的数据,你填这一行时就可以用到这个数据,注意填表从右往左就行(因为你只有一行数组) 

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

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

相关文章

vue3: pdf.js5.2.133 using typescript

npm install pdfjs-dist5.2.133 项目结构&#xff1a; <!--* creater: geovindu* since: 2025-05-09 21:56:20* LastAuthor: geovindu* lastTime: 2025-05-09 22:12:17* 文件相对于项目的路径: \jsstudy\vuepdfpreview\comonents\pdfjs.vue* message: geovindu* IDE: vscod…

H2Database SQL 插入流程

H2Database SQL 插入流程 插入数据时会先进行 SQL 解析,然后找到插入表对应的 Primary Index 对应的 BTree,然后根据二分法定位到插入的叶子节点,将 key(主键) 和 value(Row) 插入到指定的叶子节点. 解析 SQL session 加锁 创建 savepoint获取or创建事务 设置 savepoint 执行…

虚拟机ubantu20.04系统桥接模式下无法ping通外网,但可以ping通本机的解决方案

1.出现的问题&#xff1a; 虚拟机ubantu20.04系统桥接模式下无法ping通外网,但可以ping通本机。 2.解决方案&#xff1a; 如果 DHCP 未分配 IP 地址&#xff0c;可以手动配置静态 IP&#xff1a; 1.编辑网络配置文件&#xff1a; sudo nano /etc/netplan/01-netcfg.yaml 修…

面对渠道竞争,品牌该如何应对?

无论是传统零售渠道还是电商平台的&#xff0c;渠道竞争仍旧是品牌维持和扩大影响力绕不开的一环。品牌想要保证自身的市场地位和盈利能力&#xff0c;就需要充分发挥各方面的优势&#xff0c;来应对多变的市场环境。 一、改变产品定位 在存量市场上&#xff0c;消费者本身拥有…

SpringAI特性

一、SpringAI 顾问&#xff08;Advisors&#xff09; Spring AI 使用 Advisors机制来增强 AI 的能力&#xff0c;可以理解为一系列可插拔的拦截器&#xff0c;在调用 AI 前和调用 AI 后可以执行一些额外的操作&#xff0c;比如&#xff1a; 前置增强&#xff1a;调用 AI 前改…

101alpha_第6个

第6个alpha (-1 * correlation(open, volume, 10)) 这个就是看这两个相似性。10天之内的 如果结果为正且数值较大&#xff0c;投资者可能会认为在开盘价上涨时成交量萎缩&#xff0c;市场上涨动力不足&#xff0c;可能是卖出信号&#xff1b;反之&#xff0c;开盘价下跌时成交…

【渗透测试】Web服务程序解析漏洞原理、利用方式、防范措施

文章目录 Web服务程序解析漏洞原理、利用方式、防范措施一、原理**1. 定义与触发条件****2. 攻击链流程图** 二、利用方式**1. 常见漏洞类型与利用手法**(1) IIS 5.x-6.x解析漏洞(2) Apache解析漏洞(3) Nginx解析漏洞(4) IIS 7.x解析漏洞(5) PHP CGI解析漏洞&#xff08;CVE-20…

SSL证书格式详解:PEM、CER、DER、JKS、PKCS12等

引言 在网络安全领域&#xff0c;SSL/TLS证书是保障互联网通信安全的核心工具。它们通过加密连接&#xff0c;确保服务器与客户端之间的数据隐私和完整性。然而&#xff0c;对于初学者来说&#xff0c;SSL证书的多种格式——PEM、CER、JKS、PKCS12、PFX等——常常令人困惑。每…

生信服务器如何安装cellranger|生信服务器安装软件|单细胞测序软件安装

一.Why cellranger Cell Ranger 是由 10x Genomics 公司开发的一款用于处理其单细胞测序&#xff08;single-cell RNA-seq, scRNA-seq&#xff09;数据的软件套件。它主要用于将原始测序数据&#xff08;fastq 文件&#xff09;转换为可以用于下游分析的格式&#xff0c;比如基…

Redis 常见数据类型

Redis 常见数据类型 一、基本全局命令详解与实操 1. KEYS 命令 功能&#xff1a;按模式匹配返回所有符合条件的键&#xff08;生产环境慎用&#xff0c;可能导致阻塞&#xff09;。 语法&#xff1a; KEYS pattern 模式规则&#xff1a; h?llo&#xff1a;匹配 hello, ha…

33号远征队 - 游玩鉴赏

风景很好画质很好 , 图片太大只能截图一小部分 地编和特效 值得参考

使用JMETER中的JSON提取器实现接口关联

一、JSON提取器介绍 JSON提取器是JMETER工具中用于从JSON响应中提取数据的重要组件&#xff0c;常常用于接口关联场景中&#xff08;参数传递&#xff09;。 二、添加JSON提取器 举例&#xff08;积分支付接口请求数据依赖于创建订单接口响应的payOrderId&#xff09; 1.在…

QT6(35)4.8定时器QTimer 与QElapsedTimer:理论,例题的界面搭建,与功能的代码实现。

&#xff08;112&#xff09; &#xff08;113&#xff09;模仿随书老师给的源代码搭建的&#xff0c; LCD 显示的部分不一样 &#xff1a; &#xff08;114&#xff09;以下开始代码完善&#xff1a; 关联定时器的信号与槽函数 &#xff1a; &#xff08;115&#xff09;…

nvidia-smi 和 nvcc -V 作用分别是什么?

命令1&#xff1a;nvidia-smi 可以查看当前显卡的驱动版本&#xff0c;以及该驱动支持的CUDA版本。 命令2&#xff1a;nvcc -V 可以看到实际安装的CUDA工具包版本为 12.8 更详细的介绍&#xff0c;可以参考如下链接

Excel 数据 可视化 + 自动化!Excel 对比软件

各位Excel小能手们&#xff01;你们有没有过要对比两个Excel表格数据差异&#xff0c;却看得眼睛都花了的经历&#xff1f;其实啊&#xff0c;现在有专门的Excel文件比较软件能帮咱解决这大难题。这软件就是用来快速找出两个或多个Excel表格数据不同之处&#xff0c;还能把修改…

《软件项目经济性论证报告模板:全面解析与策略建议》

《软件项目经济性论证报告模板:全面解析与策略建议》 一、引言 1.1 项目背景阐述 在数字化浪潮席卷全球的当下,各行业对软件的依赖程度日益加深。[行业名称] 行业也不例外,随着业务规模的不断扩张、业务复杂度的持续提升以及市场竞争的愈发激烈,对高效、智能、定制化软件…

高频工业RFID读写器-三格电子

高频工业RFID读写器 型号&#xff1a;SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器&#xff08;RFID&#xff09;产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下&#xff0c;在自动化节点的工位上部署RFID读写设备&#xff0c;通过与制品的交互&#xf…

2025年5月计划(linux+Gpu精粹催眠+UE独立游戏)

终于步入正轨了&#xff0c;4月份为了各种面试&#xff0c;一会学这&#xff0c;一会学那。 现在&#xff0c;有大量的业余时间了&#xff0c;也该干点正事了。 按照规划&#xff0c; 1&#xff0c;ue独立游戏&#xff08;十分钟的视频即可&#xff09; 2&#xff0c;linux-&…

计算机学习路线与编程语言选择(信息差)

——授人以鱼不如授人以渔 计算机学习公式&#xff1a;1/3科班思维 1/3路线选择 1/3工程能力 好工作随便找&#xff08;来自B站小毛毛熊&#xff09; 本文主要是路线选择&#xff01;&#xff01;&#xff01;下面开始吧。 面向岗位学习&#xff01;到招聘网站看看有哪些…

『Python学习笔记』ubuntu解决matplotlit中文乱码的问题!

ubuntu解决matplotlit中文乱码的问题&#xff01; 文章目录 simhei.ttf字体下载链接&#xff1a;http://xiazaiziti.com/210356.html将字体放到合适的地方 sudo cp SimHei.ttf /usr/share/fonts/(base) zkfzkf:~$ fc-list | grep -i "SimHei" /usr/local/share/font…