01背包(详细)

news2024/9/23 3:14:52

背包最大重量为4。

有物品3件,分别有其质量和价值。

vector<int> weight={1,3,4};
vector<int> value={15,20,30};
int bag=4;

问背包能背的物品最大价值是多少? 

这是标准的动态规划问题,每一个问题鱼鳍前面的子问题相联。

目录

表格

 分析

递推公式

横竖不同遍历(个人分析)


表格

我们画一个表格就好理解了,在表格里,只需要记住,每个表格是当前的最优解(价值)

物品(重量,价值)

 分析

对于每个表格,其最大价值只有放与不放该物品,若放其价值即为该物品价值加上(背包质量-物品质量)的背包的最优解。

  • 我们举个例子:

        以橙表格为例子

        背包4如果不拿物品1,其最大价值就为他的上面一格即15价值,

        如果拿物品1,其最大价值就为物品1的价值(20)加上背包剩余空间的最大价值。就相当于背包1(4-3)的最大价值,即(15),相加即为35.

        两者对比发现拿物品1总价值最大,所以背包4在可以拿物品0~1的情况下,其最大价值(最优解)为35

  • 我们再举个例子:

        以红表格为例子:

        如果不拿物品2,其最大价值为其上一格价值35

        如果拿物品2,其最大价值为物品2价值(30)加上背包剩余空间最大价值,相当于背包0的最大价值(0),相加为30

        两者对比发现不拿物品2价值更高,即背包4在可选物品0~2的情况下,最大价值(最优解)为35

递推公式

由此,我们就可以推导递推公式了。

dp[i][j]=max(dp[i-1][j],value[i]+dp[value.size()-1][j-weight[i]]);

当然还有一种情况,就是当前物品该背包装不下,那么就直接继承其上一个格子即可。

横竖不同遍历(个人分析)

        确定完dp初始值和递推公式后,我们要确定遍历顺序了,我们有两种遍历顺序,一种是一行一行遍历,还有一种是一列一列遍历,对于这两种遍历,结果是一样的,但在遍历过程中,有几处不一样。(可忽略,不影响)

  以橙色格子为例,他的最大价值是

max(dp[i-1][j],value[i]+dp[i][j-weight[i]]);

 其中

value[i]+dp[i][j-weight[i]]

中的剩余空间最大价值,即为背包3的最优解,但是我们知道背包3的最优解应该是背包3最下面一个格子(即考虑了所有物品的最优解),但是我们却是

dp[i][j-weight[i]]

即背包3在当前行的最优解,这样按常识来讲很有可能会出错,而且这样两种写法虽然结果一样,但列出的表格里面个别数据会不一样。

        例如这个表格,橙色格子如果只考虑物品0~i,其最大价值应该是35,但是其小背包3(背包4-物品1质量)最优解为30,这样就为50

dp[value.size()-1][j-weight[i]];
//value.size()-1为最下面一格

但实际上这两种都是对的,只是思维方式不一样,

dp[i][j-weight[i]]

是每个背包只考虑物品0~i时的最优解,不考虑下面的物品。即每一个格子都是物品0~i的最优解,这样也符合我们正常的思维逻辑。

而如果看背包3最下面一个格子的话(即考虑了所有物品的最优解),背包4的当前格子数据可能会更大些,但是这样这个格子的说法就有一点说不过去了,到底是物品0~i的最优解,还是考虑所有物品的最优解呢,那这样背包4这个格子就是自己还没考虑下面的物品,但其小背包却考虑了@W@,虽然最后结果是一样的(最后结果是考虑所有物品,所以两种情况的最后一行是一样的)

当然,如果真的想考虑其剩余空间真正的最优解,那只能竖着写了,不然其小背包的最下面一个格子就属于还没遍历的格子,为0。

但是我还是建议一行一行写,这样,每一个格子就是考虑物品0~i的最优解,不会矛盾了。

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

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

相关文章

structuredClone() 详解

您是否知道&#xff0c;现在 JavaScript 中有一种原生的方式可以深拷贝对象&#xff1f; 没错&#xff0c;这个内置于 JavaScript 运行时的structuredClone函数就是这样&#xff1a; const calendarEvent {title: "Builder.io大会",date: new Date(123),attendees…

#WEB前端(CSS基础)

1.实验&#xff1a;HTML是网页骨架&#xff0c;CCS是网页装修 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; style 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

Ajax(黑马学习笔记)

Ajax介绍 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xff0c;所以必须涉及到…

风电机组来说,CMS振动数据和SCADA数据各有其优点和缺点

对于风电机组来说&#xff0c;CMS振动数据和SCADA数据各有其优点和缺点。 CMS振动数据的缺点主要包括&#xff1a; 数据解读难度高&#xff1a;振动数据包含大量的专业信息&#xff0c;如振动幅度、频率、相位等&#xff0c;需要专业的知识和技能才能准确解读。受环境影响大&…

DETR详解

1. 动机 传统的目标检测任务需要大量的人工先验知识&#xff0c;例如预定义的先验anchor&#xff0c;NMS后处理策略等。这些人工先验知识引入了很多人为因素&#xff0c;且较难处理。如果能够端到端到直接生成目标检测结果&#xff0c;将会使问题变得很优雅。 2. 主要贡献 提…

2024最新算法:电鳗觅食优化算法(Electric eel foraging optimization,EEFO)求解23个基准函数(提供MATLAB代码)

一、电鳗觅食优化算法 电鳗觅食优化算法&#xff08;Electric eel foraging optimization,EEFO&#xff09;由Weiguo Zhao等人提出的一种元启发算法&#xff0c;EEFO从自然界中电鳗表现出的智能群体觅食行为中汲取灵感。该算法对四种关键的觅食行为进行数学建模&#xff1a;相…

ESP8266智能家居(5)——开发APP深入篇

1.代码解析 接下来重点介绍一下逻辑代码 这里面主要是设置mqtt服务器的IP地址和端口号&#xff0c;设置服务器的用户名和登录密码 绑定好订阅主题和发布主题&#xff08;和8266上的订阅、发布交叉就行&#xff09; 绑定界面&#xff0c;设置界面标题 绑定6个文本控件 将从mq…

【C语言】熟悉文件基础知识

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 文件 为了数据持久化保存&#xff0c;使用文件&#xff0c;否则数据存储在内存中&#xff0c;程序退出&#xff0c;内存回收&#xff0c;数据就会丢失。 程序设计中&…

在您的下一个项目中选择 Golang 和 Node.js 之间的抉择

作为一名软件开发者&#xff0c;我总是在寻找构建应用程序的最快、最高效的工具。在速度和处理复杂任务方面&#xff0c;我认为 Golang 和 Node.js 是顶尖技术。两者在性能方面都享有极高的声誉。但哪一个更快——Golang 还是 Node&#xff1f;我决定深入一些硬核基准测试&…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思&#xff0c;如果一个类中的某个方法的具体实现不能确定&#xff0c;就可以申明成abstract修饰的抽象方法&#xff08;不能写方法体了&#xff09;&#xff0c;这个类必须用abstract修饰&#xff0c;被称为抽象类。 抽象方法定义&…

吸猫毛空气净化器哪个好?推荐除猫毛效果好宠物空气净化器品牌

当下有越来越多的家庭选择养宠物&#xff01;尽管家里变得更加温馨&#xff0c;但养宠可能会带来异味和空气中的毛发增多可能会带来健康问题&#xff0c;这是一个大问题&#xff01; 不想家里弥漫着异味&#xff0c;特别是来自宠物便便的味道&#xff0c;所以需要一款能够处理…

网络仿真(一)

网络仿真的意义 在网络规划和设计、网络设备研发、网络协议开发中&#xff0c;需要一种手段来反映和预测网络的性能 网络仿真可以提高网络规划设计的可靠性和准确性&#xff0c;明显降低网络投资风险&#xff0c;减少不必要的浪费 Ns-2 is a discrete event simulator Sched…

若依框架使用mars3d的环境配置,地球构建

因项目需要&#xff0c;原本使用过的cesium依赖&#xff0c;现在想使用火星科技mars3d的一些功能&#xff0c;所以需要引入mars3d依赖&#xff0c;整个过程非常的坎坷&#xff0c;以至于我都不知道到底是哪些部分是标准的。。。先把我认为对的记录一下&#xff1a; 1.vue.conf…

(四)优化函数,学习速率与反向传播算法--九五小庞

多层感知器 梯度下降算法 梯度的输出向量表明了在每个位置损失函数增长最快的方向&#xff0c;可将它视为表示了在函数的每个位置向那个方向移动函数值可以增长。 曲线对应于损失函数。点表示权值的当前值&#xff0c;即现在所在的位置。梯度用箭头表示&#xff0c;表明为了增…

4.Java---方法+重载

方法 方法的调用是需要开辟内存的,方法调用结束内存就被销毁了. 下面将介绍一个经典的错误标准的0分的示意! 我们日常中写交换两个数字的代码的时候都会用如下的方法进行描述: 你是不是觉得自己写的特别对!终于可以独立写一个小小的函数了? 下面运行一下看看结果 哦莫!怎么…

MySQL进阶45讲【28】如何判断一个数据库是不是出问题了?

1 前言 在MySQL进阶45讲【24】MySQL是怎么保证高可用的&#xff1f;和MySQL进阶45讲【26】主库出问题了&#xff0c;从库怎么办&#xff1f;文章中&#xff0c;介绍了主备切换流程。从这两篇文章中可以知道&#xff0c;在一主一备的双M架构里&#xff0c;主备切换只需要把客户…

kettle开发-Day43-加密环境下运行作业

前言&#xff1a; 金三银四&#xff0c;开年第一篇我们来介绍下&#xff0c;怎么在加密情况下运行我们的kettle作业及任务。无疑现在所有企业都认识到加密的重要性&#xff0c;加密后的文件在对外传输的时候不能被访问&#xff0c;访问时出现一堆乱码&#xff0c;同时正常的应用…

nginx笔记整理

目录 一.Nginx基础介绍 二.nginx安装配置 三.Nginx配置文件 3.1nginx主配置文件(/etc/nginx/nginx.conf) 3.2默认的网站配置文件(/etc/nginx/conf.d/default.conf) 四.创建新的虚拟主机 五.Nginx日志 5.1nginx日志格式 5.2查看日志 5.3日志缓存(了解) 5.4日志轮转(/…

Linux内核队列queue.h

文章目录 一、简介二、SLIST单向无尾链表2.1 介绍2.2 操作2.3 例子 三、STAILQ单向有尾链表四、LIST双向无尾链表五、TAILQ双向有尾链表六、CIRCLEQ循环链表七、queue源码参考 一、简介 queue.h是一个非常经典的文件&#xff0c;定义了一系列宏的操作&#xff0c;它定义了一系…

.halo勒索病毒的最新威胁:如何恢复您的数据?

尊敬的读者&#xff1a; 随着科技的发展&#xff0c;网络安全已经成为我们日常生活中不可忽视的重要议题。其中&#xff0c;勒索病毒是当前网络安全威胁中的一大挑战&#xff0c;而“.halo”勒索病毒更是近期备受关注的恶意软件之一。本文将介绍关于“.halo”勒索病毒的背景知…