React+TS+css in js 练习

今天分享的内容是动态规划的经典问题--0-1 背包问题

0-1背包问题的描述如下:给定一组物品,每种物品都有自己的重量和价值,背包的总容量是固定的。我们需要从这些物品中挑选一部分,使得背包内物品的总价值最大,同时不超过背包的总容量。
举个例子:假设这组物品的质量分别是:

const weight = [2, 2, 6, 4, 3];

背包总容量为 9,请问将这些物品装入背包,最多能装多少,分别是哪些?

思路分析

之前用回溯算法解决过这个问题,回溯算法有其自身的局限性--指数级别的复杂度。那这篇文章就和上篇文章一样,用动态规划的思路把 0-1 背包问题重新解决一遍

回溯算法的思路是,每种可能都去尝试,即遍历所有的可能,找到最优解。而动态规划不会傻傻地遍历所有的可能性,而是会去掉重复的路径,在剩下的路径下继续探索

背包的总容量是 9,那么不看具体的物品重量,放入背包的重量的可能性一共有 9 种,动态规划将会使计算范围框定在这 9 种范围之内,并且相同重量的物品组合,只保留其中一种。这样下来,动态规划的复杂度就是 n*m 了,n 是物品的种类,m 是背包的总容量

看不明白?没关系,看看下面的过程分析就懂啦

过程分析

image.png

weight = [2, 2, 6, 4, 3];

代码的实现就是填满上面的表格。行表示,该行的物品不放的重量种类;列表示背包中物品重量之和
上面第一个行填了两个 true,第一个 true 表示不放 1 号物品时,背包的总重量是 0kg;第二个 true 表示放 1 号物品时,背包的总重量是 2kg
继续填第二行

image.png

weight = [2, 2, 6, 4, 3];

共有 3 个 true, 第一个 true 和 第二个 true 表示不放入 2 号物品时,背包的重量可能性--有 0kg2kg 两种可能性;第三个 true 表示,同时放 1 号物品和 2 号物品的情况。

其实,大家仔细想想,如果只放 2 号物品,不放 1 号物品时,背包的重量是多少?也是 2kg,所以第二个 true 也表示只放 2 号物品,不放 1 号物品的情况。这里动态规划将两个 2kg 的情况合并成一种情况。

以至于 1 号和 2 号物品的放与不放有 2^2 种情况,但是组合成的重量却只有 3 种情况. 这就是动态规划提升性能的关键

继续往下看

image.png

weight = [2, 2, 6, 4, 3];

第三行共有 5 个 true,前 3 个 true 直接看成是不放 3 号物品时,背包重量的可能性。后面两个 true,一个是 6kg,是只放 3 号物品的情况;另一个是 8kg,可以看成是放 1 号和 3 号物品的情况,也可以看成是 2 号和 3 号物品的情况。

3 种物品共有 2^3 情况,但是动态规划将其合并成 5 种情况。

true 的填写是有规律的,首先填写不放该行物品的情况,即直接照抄上一行的内容,然后从前往后依次对每个 true 的重量加上自身重量,比如第 3 行的第 4 个 true,就是第一个 true 的 0kg 加上 6kg 得到的。第 3 行的第 5 个 true ,是第二个 true 的 2kg 加上 6kg 得到的。再往后相加的话就超过 9kg 了,就停止相加。

大家可以试着推推第 4 行的内容


第 4 行:

image.png

weight = [2, 2, 6, 4, 3];

第 5 行:

image.png

weight = [2, 2, 6, 4, 3];

可以看到第 5 行的最后一格是 true,也就说明,物品的组合中,是可以将背包填满的。所以背包可以装入的最大重量是 9kg,问题解决!

代码实现

const weight = [1, 2, 2, 6, 5, 8];const findWeight = (weight) => {const store = Array(weight.length).fill(1).map(() => Array(packageWeight + 1).fill(false));store[0][0] = true;store[0][weight[0]] = true;for (let i = 1; i < store.length; i++) {// 不放第i个物品for (let j = 0; j <= packageWeight; j++) {if (store[i - 1][j]) store[i][j] = true;}// 放第i个物品for (let j = 0; j <= packageWeight - weight[i]; j++) {if (store[i - 1][j]) store[i][j + weight[i]] = true;}}for (let i = packageWeight; i >= 0; i--) {if (store[weight.length - 1][i]) {console.log("the max weight is ", i);break;}}
}
  1. 定义一个数组weight,表示物品的重量。变量packageWeight,表示背包的容量。接着实现了一个名为findWeight的函数,该函数接受一个参数weight,即物品重量的集合

在findWeight函数中,首先创建一个二维数组store,用来表示上面过程分析的表格,表格的内容初始化为 false。store 的行和列含义也和上面表格一致。在遍历 store 之前,先初始化第一行的内容,即放与不放 0 号物品的两种情况。

遍历 store 数组,从第二行开始,也就是 i==1。每一行先考虑不放第 i 个物品。然后再计算放入第 i 个物品的时候,这一行的内容有什么变化。

遍历完所有的行,store 数组中最后一行的最后一个 true 所表示的重量,就是我们要的答案啦

执行代码

findWeight(weight);
// the max weight is  9

这是 store 的内容:

image.png

换个数据试试:

const weight = [2, 2, 6, 4, 4];
findWeight(weight);
// the max weight is  8

这是 store 中的内容情况:

image.png

遗留的问题

按照上面的代码只是知道了最多能装多少,但不知道装了哪些东西,你可以根据最后生成的store内容判断放入了哪些东西吗?在之后的文章中,大家可以看到对这个问题的解答

总结

这篇文章讲了如何用动态规划来解决 0-1 背包问题,其中有解题的思路分析,还有具体的过程分析,每个过程都有图片,很清晰了。相信大家对着图片多看几遍,就知道动态规划是怎么解决问题的了。最后还有 JS 代码实现,大家可以 copy 到本地跑一跑,这样会更清楚

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

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

相关文章

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数&#xff0c;判断一个损失函数的好坏无监督分类&#xff1a;kmeans无监督分类&#xff0c;Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…

【数据结构计数排序】计数排序

非比较排序概念 非比较排序是一种排序算法&#xff0c;它不是通过比较元素大小进行排序的&#xff0c;而是基于元素的特征和属性排序。这种排序方法在特定情况下&#xff0c;可以做到比元素比较排序&#xff08;快排&#xff0c;归并&#xff09;更有效率。尤其是在处理大量数…

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合 单例模…

【数据结构与算法】排序算法(上)——插入排序与选择排序

文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法&#xff0c;第一是插入排序&#xff0c;二是选择排序&#xff…

qml项目创建的区别

在Qt框架中&#xff0c;你可以使用不同的模板来创建应用程序。你提到的这几个项目类型主要针对的是Qt的不同模块和用户界面技术。下面我将分别解释这些项目类型的区别&#xff1a; 根据你提供的信息&#xff0c;以下是每个项目模板的详细描述和适用场景&#xff1a; Qt Widgets…

【热门主题】000077 物联网智能项目:开启智能未来的钥匙

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

时序约束进阶六:Set_Clock_Groups详解

目录 一、前言 二、时钟间关系 2.1 时钟关系分类 2.2 时钟关系查看 三、set_clock_groups设置 3.1 使用格式 3.2 优先级 3.3 约束设置示例 3.4 约束效果查看 四、Exclusive差异说明 4.1 Asynchronous 4.2 Logically_exclusive与Physically_exclusive 4.3 logical…

智慧银行反欺诈大数据管控平台方案(一)

智慧银行反欺诈大数据管控平台建设方案的核心在于通过整合先进的大数据技术和深度学习算法&#xff0c;打造一个全面、智能且实时的反欺诈系统&#xff0c;以有效识别、预防和应对各类金融欺诈行为。该方案涵盖数据采集、存储、处理和分析的全流程&#xff0c;利用多元化的数据…

系统架构:MVVM

引言 MVVM 全称 Model-View-ViewModel&#xff0c;是在 MVP&#xff08;Model-View-Presenter&#xff09;架构模式基础上的进一步演进与优化。MVVM 与 MVP 的基本架构相似&#xff0c;但 MVVM 独特地引入了数据双向绑定机制。这一创新机制有效解决了 MVP 模式中 Model 与 Vie…

ARM CCA机密计算安全模型之硬件强制安全

安全之安全(security)博客目录导读 [要求 R0004] Arm 强烈建议所有 CCA 实现都使用硬件强制的安全(CCA HES)。本文件其余部分假设系统启用了 CCA HES。 CCA HES 是一个可信子系统的租户——一个 CCA HES 主机(Host),见下图所示。它将以下监控安全域服务从应用处理元件(P…

【电子通识】失效分析的流程和方法

在文章:【电子通识】失效分析的基本概念-CSDN博客 中我们讲到失效分析是是指产品失效后,根据失效的现象/模式,通过分析和验证,模拟重现失效的现象,找出失效的原因,挖掘出失效的机理的活动。 同时还讲到失效模式和失效机理,并且以LED和贴片电阻做为举例。 失效模式是失效…

Flutter:页面滚动

1、单一页面&#xff0c;没有列表没分页的&#xff0c;推荐使用&#xff1a;SingleChildScrollView() return Scaffold(backgroundColor: Color(0xffF6F6F6),body: SingleChildScrollView(child: _buildView()) );2、列表没分页&#xff0c;如购物车页&#xff0c;每个item之间…

facebook欧洲户开户条件有哪些又有何优势?

在当今数字营销时代&#xff0c;Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台&#xff0c;广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型&#xff0c;包括个人广告账户、企业管理&#xff08;BM&#…

WEB攻防-通用漏洞CSRFSSRF协议玩法内网探针漏洞利用

CSRF构造工具&#xff0c;也可以用bp构造 选中要保存的请求&#xff0c;点击Generate HTML,生成带有添加用户请求的html文件&#xff0c;然后将构造的html放在网站上&#xff0c;生成访问地址&#xff0c;诱导管理员点击链接&#xff0c;就会添加用户 start Recording之后就会…

C#面向对象之访问限制,类基础,继承

文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…

代码之丑第一期-缩进

各位小伙伴们&#xff0c;大家好&#xff01;咱今天就算是正式开张了。实不相瞒&#xff0c;第一期的内容早已写好&#xff0c;但唯独这开篇方式&#xff0c;笔者想了好些时间&#xff0c;包括但不限于如下风格&#xff1a; 斗破苍穹式&#xff08;已经三刷&#xff09;&#…

JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】

前言&#xff1a; 前面我们分析怎么去预估系统资源&#xff0c;怎么去设置 JVM 参数以及怎么去看 GC 日志&#xff0c;本篇我们分享一些常用的 JVM 调优工具&#xff0c;我们在进行 JVM 调优的时候&#xff0c;通常需要借助一些工具来对系统的进行相关分析&#xff0c;从而确定…

linux上离线部署Mysql5.7.22

官网下载地址: https://downloads.mysql.com/archives/community/ Mysql安装步骤&#xff1a; 1.上传mysql安装包 上传 mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 到服务器指定目录 2.解压缩 tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 3.修改名称 mv mysq…

日志与线程池

这里写自定义目录标题 日志Log.hpp测试main.cpp结果 线程池线程池的种类ThreadPool.hpp测试 Task.hpp 和 main.cppTask.hppmain.cpp结果 线程池的单例模式实现方式SignalThreadPool.hpp测试main.cpp 线程安全与重入问题死锁死锁的四个必要条件 日志 日志需要包含的信息 • 时间…

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据&#xff1a;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象&#xff1a;是具有相同性质的数据元素的集合&…