【算法宇宙——在故事中学算法】背包dp之01背包问题

news2024/10/5 5:11:33

唯手熟尔方成艺,唯读书能致卓越。勤学苦练方可成,路漫漫其修远兮!

请添加图片描述

文章目录

  • 前言
  • 正文
    • 故事
    • 总结

前言

尽管计算机是门严谨的学科,但正因为严谨,所以要有趣味才能看得下去。在笔者的前几篇算法类文章中,都采用了以小故事作为引入的方式来介绍算法,但在回看的时候发现学术味还是太浓了,完全没有想看下去的欲望orz~因此笔者决定改组文章结构,将整个算法都以故事的形式呈现,至少让读者能看下去,并把算法类的文章统一成【算法宇宙——在故事中学算法】专栏,希望能帮助到大家!

正文

故事

小明是一个热爱探险,渴望在宇宙中遨游的少年,但他的父亲一直管束着他,不让他出去。终于,在他十八岁的生日上,他的父亲把他喊过来。

明父:儿子啊,你已经是个成熟的大人了,从今天开始,你可以去宇宙中探险了。

小明:好耶!!

明父:慢着,宇宙中危险遍地,海盗横行,所以在你出去之前,我有东西要给你。

(明父把小明带到他自己的房间,打开了一个大箱子,很多装备映入小明的眼帘)

小明:父亲,你把这些全都给我吗?谢谢父亲!

明父怒道:逆子,就算都给你了,你那艘小破飞船怎么装这么多装备?听着,现在这些装备的重量和杀伤力都写在上面,你可以随便挑,但如果你把你挑的装备都搬到飞船上之后,飞船飞不起来的话(因为装备太重了),你就别出去了,乖乖学算法,知道没有?

(明父出去了)

小明:这么多装备,我得思考一下……

(小明想了想,决定先按自己的直觉来。他拿起了第一件装备,向飞船上扔,然后拿起第二件继续扔,直到飞船即将超重为止。然后他满意的停下,之后他发现,外面还有很多重量小的高杀伤性武器,他无奈地笑了笑,把船上的武器都搬了下来重新选。)

小明:既然有这么多轻的武器,那么挑轻的来不就好了,量变引起质变嘛,我真聪明!

(他又开始向上搬武器,但这次他发现,好像有一些很重,但杀伤力极强的武器没有被选。他又花大力气把武器都搬了出来。)

小明:那这次我先搬杀伤力大的总行了吧!?

(很不幸的是,这次他只搬了几件武器,飞船就超重了,杀伤力甚至没有第一次强。)

抓耳挠腮的小明:哎呀,好烦啊。。都怪以前没有好好学算法,好后悔啊。。

(他思考良久也没能想出个所以然。无奈之下的他,垂着头去找了明父。)

得意的明父:就知道你小子不会搬,这次还不好好学习?行吧,这次我就告诉你怎么搬最好,但你以后去探险,也不能忘了学习算法啊!你记不记得,你以前做过一道采药的问题?(见记忆化搜索)

(明父拿出了一张表格)

明父:看好了臭小子,这张表格的两个维度分别是去哪一件武器和飞船为已经搬好的武器所分配的载重。觉不觉得和采药的那道题很相似?没错,这两道题其实是同一种题型,01背包问题。对01背包问题来说,转移方程都是固定的:
在这里插入图片描述

所以你知道怎么解决了吧?去把这个表格填好,然后赶紧去搬吧!

(小明拿过表格,沉思了一会。忽然,他灵光一闪。)

小明:父亲,你看这个转移方程,每一个i的更新只和i-1有关系,而且每次更新完i-1之后马上就更新i,并且我们实际上只需要最后一行的数据,那是不是意味着,我们可以只用一行存储数据呢?那么转移方程就可以是:

明父笑道:说得对!这是个很好的想法,但你要看清楚,这么做的话,由于你更新第j个数据时用到了上一次的第j个和第j-w[i]个,所以在更新数据的时候你要从后往前更新,才会保存更新用到的数据。

(小明欢呼了一声,拿着表格跑去搬装备了,搬完装备后,他驾驶着飞船,和父亲道别后,开始了属于自己的探险之旅。)

总结

小明的故事暂时告一段落了,但我们的算法还需要稍微解释一下。
fi,j指的是选择第i件物品时,已被选择的物品如果占据了j这么多的载重,那么他们能创造的最大价值。
所以重新解释一下一开始的二维转移方程的第二项:如果选择取第i件物品,那么前面i-1件物品中选择的哪些物品就只能占据了j-w[i]这么多的载重,因为第i件物品分走了w[i]的载重。

其余的也没什么需要解释的了,直接上代码:

#include <iostream>
using namespace std;
const int maxn = 13010;
int n, W, w[maxn], v[maxn], f[maxn];

int main() {
  cin >> n >> W;
  for (int i = 1; i <= n; i++) cin >> w[i] >> v[i]; 
  for (int i = 1; i <= n; i++)//循环n次,因为要对n件物品进行选择
    for (int l = W; l >= w[i]; l--)//从后向前更新
      f[l] = max(f[l], f[l - w[i]] + v[i]);//转移方程
  cout << f[W];
  return 0;
}

——————————————分割线————————————————
我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!这次采用了以故事为主的结构,希望你能喜欢!码文不易,如果觉得好的话,可以关注一下,我会在将来带来更多更全面的算法讲解!

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

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

相关文章

智慧公厕系统的应用示例

近几年&#xff0c;在一些高速服务区或者一些城市的公共厕所当中&#xff0c;总会看见一些富有科技感的硬件&#xff0c;比如厕位有无人指示灯、厕所除臭杀菌机、智能取纸机、智能洗手台镜面广告机等。现在在衡量城市发展的过程中&#xff0c;总会以城市的建设&#xff0c;城市…

Weblogic远程代码执行漏洞 CVE-2023-21839

漏洞简介 WebLogic Core远程代码执行漏洞&#xff08;CVE-2023-21839&#xff09;&#xff0c;该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议进行 JNDI lookup 操作&#xff0c;破坏易受攻击的WebLogic服务器&#xff0c;成功利用此漏洞可能导致Oracle WebLogic服务器被接…

MySQL可重复读事务隔离具体是怎么实现的

事务的启动会有的操作 事务的隔离等级有四种&#xff0c;现在说默认的可重复读&#xff0c;可重复读就是一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下&#xff0c;未提交变更对其他事务也是不可见的。 可重复…

Java阶段一Day22

Java阶段一Day22 文章目录Java阶段一Day22线程安全synchronized教师总结新单词多线程多线程并发安全问题概念例synchronized关键字同步方法同步块在静态方法上使用synchronized互斥锁总结重点:多线程并发安全问题聊天室(续)实现服务端发送消息给客户端服务端转发消息给所有客户…

内网穿透实现在外远程连接RabbitMQ服务

文章目录前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址转载自远控源码文章&#xff1a;无公网IP&#xff0c;…

Linux Systemd type=simple和type=forking的区别

Typeforking 使用Typeforking时&#xff0c;要求ExecStart启动的命令自身就是以daemon模式运行的。 而以daemon模式运行的进程都有一个特性&#xff1a;总是会有一个瞬间退出的中间父进程&#xff0c;例如&#xff0c;nginx命令默认以daemon模式运行&#xff0c;所以可直接将其…

Nodejs vm/vm2沙箱逃逸

文章目录什么是沙箱以及VM&#xff1f;vm模块nodejs作用域vm沙箱vm沙箱逃逸vm2例题分析&#xff1a;&#xff08;待补充&#xff09;[HFCTF2020]JustEscape[HZNUCTF 2023 final]eznode參考文章:什么是沙箱以及VM&#xff1f; 什么是沙箱&#xff1a; 沙箱就是能够像一个集装箱…

Ansys Speos | 联合 optiSLang 背光板设计优化方案

在这个例子中&#xff0c;讲述如何建模一个典型的背光单元及其与亮度和均匀性有关的照度分布。其中一个关键特点是使用了Speos 3D Texture功能&#xff0c;这是最初开发的用于背光单元产品&#xff0c;并可用于设计导光板&#xff0c;亮度增强膜(BEF)和由数千/数百万组成的背光…

《程序员面试金典(第6版)》面试题 10.03. 搜索旋转数组(二分法,分钟思想,入门题目)

题目描述 搜索旋转数组。给定一个排序后的数组&#xff0c;包含n个整数&#xff0c;但这个数组已被旋转过很多次了&#xff0c;次数不详。请编写代码找出数组中的某个元素&#xff0c;假设数组元素原先是按升序排列的。若有多个相同元素&#xff0c;返回索引值最小的一个。 示例…

C学习笔记2

1、二进制由 0 和 1 两个数字组成&#xff0c;使用时必须以0b或0B&#xff08;不区分大小写&#xff09;开头 2、符号位进制形式进制数据 &#xff08;进制形式决定后面的数据是哪种进制&#xff09; 3、合法的二进制 int a 0b101; // 0b是二进制的进制形式 101是进制…

buildroot使用外部编译链编译bluez蓝牙工具

在开发ublox w263 wifi蓝牙时&#xff0c;之前是使用yocto系统集成编译出的bluez工具&#xff0c;减少了自己编译工具软件和依赖库的工作&#xff0c;切换项目使用原生linux系统后&#xff0c;所以的软件需要自己编译&#xff0c;不想编译每个依赖文件和库&#xff0c;所以使用…

Pytorch深度学习笔记(三)线性模型

目录 1.机械学习的过程 2.线性模型 推荐课程&#xff1a;2.线性模型_哔哩哔哩_bilibili 1.机械学习的过程 机械学习的过程&#xff1a; 1.准备数据集DataSet——>2.选择模型Model——>3.训练Training——>4.推理Infering 监督学习&#xff1a;用已知标签的训练样本训…

Spark大数据处理讲课笔记3.1 掌握RDD的创建

文章目录零、本节学习目标一、RDD为何物&#xff08;一&#xff09;RDD概念&#xff08;二&#xff09;RDD示例&#xff08;三&#xff09;RDD主要特征二、做好准备工作&#xff08;一&#xff09;准备文件1、准备本地系统文件2、启动HDFS服务3、上传文件到HDFS&#xff08;二&…

4年软件测试工作经验,跳槽之后面试20余家公司的总结

先说一下自己的个人情况&#xff0c;普通二本计算机专业毕业&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而离职后到今天都没有收到一份offer&#xff01;一直在待业中&#xff0c;从离职第一天就开始准备简历&#xff0c…

快排的非递归实现

其思想与递归实现快排完全相同&#xff0c;可以先将第一次要排序的右边界和左边界先后入栈&#xff0c;然后判断栈 是否为空&#xff0c;不为空就出栈顶元素&#xff0c;并删除一次&#xff0c;由于栈是先进的后出&#xff0c;所以先出来的应该是左界&#xff0c; 再进行一次…

【C++】STL——unordered_map和unordered_set的介绍和使用

unordered_set和unordered_map的介绍和使用 文章目录unordered_set和unordered_map的介绍和使用一、unordered系列关联式容器二、unordered_set1.unordered_set的介绍2.unordered_set的构造方式3.unordered_set的函数接口说明4.unordered_multiset的介绍及使用三、unordered_ma…

【建议收藏】数据库 SQL 入门——约束(内附演示)

文章目录&#x1f4da;引言&#x1f4d6;约束&#x1f4d1;非空约束&#x1f4d1;唯一约束&#x1f4d1;主键约束&#x1f4d1;默认约束&#x1f4d1;检查约束&#x1f4d1;外键约束&#x1f516;外键的添加&#x1f516;删除/更新外键&#x1f4cd;总结&#x1f4da;引言 &…

【高危】Apache Linkis Gateway模块存在身份验证绕过漏洞(CVE-2023-27987)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦&#xff0c;提供标准化接口的中间件。Gateway 是 Linkis 接受客户端和外部请求的主要入口点&#xff0c; 在 Apache Linkis 受影响版本中&#xff0c;由于在 Linkis Gateway 部署时产生的Token默认为LINKIS_C…

Linux打印口/LPT口出厂测试工具与使用说明

1 软件功能 该软件用于在Linux平台测试CH35X/CH38X&#xff08;PCI/PCIe转串并口&#xff09;的并口各引脚功能是否正常。方便对设备进行出厂测试。 2 并口测试硬件治具 在测试前&#xff0c;需要制作单独的硬件治具&#xff0c;按下表连接信号线&#xff1a; 25针并口座子堵…

面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;店主自己整理的说明文档&#xff0c;公式、约束、数据齐全&#xff0c;可联系我查看 仿真平台&#xff1a;MATLAB YA…