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

潜江做网站/郑州短视频代运营公司

潜江做网站,郑州短视频代运营公司,学生个人网站设计,114推广平台背包问题 下图将背包问题做了分类 其中之重点,是01背包,即一堆物件选哪样不选哪样放入背包里。难度在于,以前的状态转移,多只用考虑一个变量,比如爬楼梯的阶层,路径点的选择,这也是能用滚动数组…

背包问题

下图将背包问题做了分类

416.分割等和子集1

其中之重点,是01背包,即一堆物件选哪样不选哪样放入背包里。难度在于,以前的状态转移,多只用考虑一个变量,比如爬楼梯的阶层,路径点的选择,这也是能用滚动数组表示动态规划的原因,而现在要同时考虑两个:物品和背包容量。

01背包

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

使用动态规划五部曲:

1 - 确定dp数组含义:有一种写法, 是使用二维数组,即dp[i] [j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

2 - 到了第 i 件物品的时候,背包容量为 j ,但就放不放物品,两种选择:

  • 不放第 i 件物品,那么背包容量不变,从dp[i - 1] [j]状态而来
  • 放第 i 件物品,那么就会从dp[i - 1] [j - weight[i]]状态而来,因为至少得有足够的空间将物品放进去才行。

所以递归公式: dp[i] [j] = max(dp[i - 1] [j], dp[i - 1] [j - weight[i]] + value[i]);

3 - 初始化dp数组:如果是01背包的话,背包容量如果为零,那么价值也一定为零。而能放入第一件物品的时候,就是其对应的价值。

动态规划-背包问题3

4 - 遍历顺序:这一步比较重要,在初期理解01背包的时候会显得有一点难以理解。但总归记住,就是一个二维数组,和之前的题目一样,先遍历物品再遍历背包容量(物品固定,尝试一点点把物品塞进去),和先遍历背包容量再遍历物品(背包容量固定,尝试能塞进去哪个)都是可以的。

从数组的角度考虑这一点也是可以的,根据递推公式,当前状态是从数组的左上角位置而来,只要保持是这个方向就可以了。就和我们之前求解路径问题时一样。

5 - 举例推导

假设背包最大重量为4。

物品为:

重量价值
物品0115
物品1320
物品2430

那么数组的最终状态就如下图所示:

动态规划-背包问题4

关于01背包,也有使用一维数组,即滚动数组的方法。其核心思想是,如果不放物品,dp[j]其实就是自己本身,如果要放物品,那么dp[j] 就是考虑从一个能放下这个物品的背包,塞入该物品,即dp[j - weight[i]] + value[i]。

遍历顺序就是不能是从一个空背包开始放了,而是从一个满的背包里尝试取出某件物品,这样做是为了保证物品只被放入一次。这么做也是有现实依据的,就是先考虑所有能用得上的东西,再从这些物品里挑出来不是那么重要的物品。

我私认为,注重理论推导,就可以在后期的解题过程中方便不少,但是也不必过于纠结能否“记住理论”,还是要投入实际应用才能更好的理解理论。

接下来,进入解题过程。

416 分割等和子集 medium

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

为什么说动态规划难呢?我认为是不少时候压根意识不到该用动态规划求解问题。

关于这道题,首先要想到要对整个数组求和,如果和是奇数,咋分都分不出来。

如果是偶数,那么所有数之和的一半,就是我们期望的“背包最大容量”,剩下的事情就是把数字填进去就可以了,和01背包完全一样。

根据这个思想,代码如下:

bool canPartition(vector<int>& nums) {int sum = 0;for (int num: nums)sum += num;if (sum % 2 == 1) return false;int target = sum / 2;vector<int> dp(10001, 0); // 题目中给出数组长度最大是200,值最大是100,取总和的一半肯定够了// 我们采用先遍历数字的方式for (int i = 0; i < nums.size(); ++i) {for (int j = target; j >= nums[i]; --j) {dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[target] == target;
}

1049 最后一块石头的重量 II medium

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

实不相瞒,以我现在的水平,看到这道题,我还是想不到应该用动态规划来做,但是多少有点儿那个味儿了。

要使最后剩下的石块重量尽可能小,就需要能撞掉的石头尽可能多,所以这道题可以看成是背包容量为[总重量/2](向下取整),物品价值就是石头重量的0-1背包问题。

求解方式和上面的题几乎一模一样,代码如下:

int lastStoneWeightII(vector<int>& stones) {int totalWeight = 0;for (int stoneWeight: stones)totalWeight += stoneWeight;vector<int> dp(15001, 0);int target = totalWeight / 2;for (int i = 0; i < stones.size(); ++i) {for (int stonesWeight = target; stonesWeight >= stones[i]; --stonesWeight) {dp[stonesWeight] = max(dp[stonesWeight], dp[stonesWeight - stones[i]] + stones[i]);}}return totalWeight - 2 * dp[target];
}

说到这里,可能还是有人不太明白为什么能这么写,之所以要尽量的往总数量一半的背包里塞,就说明这些都是希望能尽量被撞掉的,可以证明,如果能达到一半的容量,那么其必然可以全部被撞掉,所以最后要减去2倍的dp[target]。

相关文章:

LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II

背包问题 下图将背包问题做了分类 其中之重点&#xff0c;是01背包&#xff0c;即一堆物件选哪样不选哪样放入背包里。难度在于&#xff0c;以前的状态转移&#xff0c;多只用考虑一个变量&#xff0c;比如爬楼梯的阶层&#xff0c;路径点的选择&#xff0c;这也是能用滚动数组…...

【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(二)

demux模块 从前面一篇文章中可以得知&#xff0c;demux模块的使用方法大致如下: 分配AVFormatContext通过avformat_open_input(…)传入AVFormatContext指针和文件路径&#xff0c;启动demux通过av_read_frame(…) 从AVFormatContext中读取demux后的audio/video/subtitle数据包…...

PCIE 学习笔记(入门简介)

PCIE 学习笔记书到用时方恨少啊&#xff0c;一年前学PCIE的笔记&#xff0c;再拿出来瞅瞅。发到博客上&#xff0c;方便看。PCIE基础PCIE和PCI的不同PCIE采用差分信号传输&#xff0c;并且是dual-simplex传输——每条lane上有TX通道和RX通道&#xff0c;所以每条lane上的信号是…...

锁的优化机制了解嘛?请进!

点个关注&#xff0c;必回关 文章目录自旋锁&#xff1a;自适应锁&#xff1a;锁消除&#xff1a;锁粗化&#xff1a;偏向锁&#xff1a;轻量级锁&#xff1a;从JDK1.6版本之后&#xff0c;synchronized本身也在不断优化锁的机制&#xff0c;有些情况下他并不会是一个很重量级的…...

5.点赞功能 Redis

Redis&#xff08;1&#xff09;简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务&#xff0c;即原子性&#xff0c;通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中&#xff0c;性能高。&#xff08;2&#…...

Java序列化和反序列化(详解)

一、理解Java序列化和反序列化 Serialization(序列化)&#xff1a;将java对象以一连串的字节保存在磁盘文件中的过程&#xff0c;也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 deserialization(反序列化)&#xff1a;将保存在磁…...

【刷题篇】链表(上)

前言&#x1f308;前段时间我们学习了单向链表和双向链表&#xff0c;本期将带来3道与链表相关的OJ题来巩固对链表的理解。话不多说&#xff0c;让我们进入今天的题目吧&#xff01;&#x1f680;本期的题目有&#xff1a;反转单链表、链表的中间结点、合并两个有序链表反转单链…...

ConcurrentHashMap设计思路

ConcurrentHashMap设计思路Hashtable vs ConcurrentHashMapHashtable vs ConcurrentHashMap Hashtable 对比 ConcurrentHashMap Hashtable 与 ConcurrentHashMap 都是线程安全的 Map 集合Hashtable 并发度低&#xff0c;整个 Hashtable 对应一把锁&#xff0c;同一时刻&#…...

Unity基于GraphView的行为树编辑器

这里写自定义目录标题概述基于GitHub上&#xff1a;目前这只是做了一些比较基础的功能节点开发&#xff0c;仅仅用于学习交流&#xff0c;非完成品。项目GitHub连接&#xff1a;[https://github.com/HengyuanLee/BehaviorTreeExamples](https://github.com/HengyuanLee/Behavio…...

网络流量传输MTU解析

基本概念 以太网的链路层对数据帧的长度会有一个限制&#xff0c;其最大值默认是1500字节&#xff0c;链路层的这个特性称为MTU&#xff0c;即最大传输单元 Maximum Transmission Unit&#xff0c;最大传输单元&#xff0c;指的是数据链路层的最大payload&#xff0c;由硬件网…...

30个HTML+CSS前端开发案例(四)

30个HTMLCSS前端开发案例&#xff08;17-20&#xff09;鼠标移入文字加载动画效果代码实现效果鼠标悬停缩放效果实现代码效果鼠标移入旋转动画实现代码效果loding加载动画实现代码效果资源包鼠标移入文字加载动画效果 代码实现 <!DOCTYPE html> <html><head&g…...

《TPM原理及应用指南》学习 —— TPM执行环境3

本文对应《A Practical Guide to TPM 2.0 — Using the Trusted Platform Module in the New Age of Security》的第6章第3节。 6.3 Summary —— 总结 Now that you have an execution environment (or maybe both of them) set up, you’re ready to run the code samples f…...

实验名称:经典同步问题:生成者与消费者问题

实验名称&#xff1a;经典同步问题&#xff1a;生成者与消费者问题 相关知识 信号量 信号量是用来协调不同进程间的数据对象&#xff0c;可用来保护共享资源&#xff0c;也能用来实现进程间及同一进程不同线程间的进程同步。分为二值信号灯和计算信号灯两种类型。 进程与线…...

EasyCVR视频云存储的架构解析与Sharelist云存挂载方法介绍

一、什么是视频云存储&#xff1f; 视频云存储主要用于为上层应用提供视频文件、结构化信息、事件信息的相关服务。云存储节点分为数据文件存储节点和结构化数据存储节点。数据文件存储节点主要用于视频、图片的存储。结构化数据存储节点用于存储结构化数据并提供相关服务。 …...

电机参数中力矩单位kgf.cm,Nm,mNm表示的含义

力的基本知识 质量和力的比例系数 质量和重力的关系有一个重力系数&#xff1a;g≈9.8 N/kg≈10,后面看到的1kgf就相当于1kg物体的力也就是10N 杠杆原理 对于同一个支点&#xff0c;在不考虑杠杆的重量的情况下&#xff0c;实现同样的作用效果&#xff0c;距离支点越近&…...

使用scikit-learn为PyTorch 模型进行超参数网格搜索

scikit-learn是Python中最好的机器学习库&#xff0c;而PyTorch又为我们构建模型提供了方便的操作&#xff0c;能否将它们的优点整合起来呢&#xff1f;在本文中&#xff0c;我们将介绍如何使用 scikit-learn中的网格搜索功能来调整 PyTorch 深度学习模型的超参数: 如何包装 P…...

Windeployqt 打包,缺少dll 的解决方法

Windeployqt 打包&#xff0c;缺少DLL 的原因分析&#xff0c;解决方法 很多同学使用工具windeployqt进行打包发布后&#xff0c;运行exe文件时&#xff0c;还是会出现下图所示的系统错误提示&#xff0c;这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显…...

第四章:搭建Windows server AD域和树域

由于Windows简单一点&#xff0c;我就先搞Windows了。AD域&#xff1a;视频教程&#xff1a;https://www.bilibili.com/video/BV1f84y1G72x/在创建AD域时要把网卡配置好这是打开网卡界面的命令DNS要改成自己的&#xff0c;因为在创建域的同时也会自动创建DNS打开服务器管理器&a…...

【解决方案】老旧小区升级改造,视频智能化能力如何提升居民安全感?

一、需求背景 随着我国社会经济的快速发展与进步&#xff0c;城市宜居程度成为城市发展的重要指标&#xff0c;城市的发展面临着更新、改造和宜居建设等。一方面&#xff0c;社区居民对生活的环境提出了更高的要求&#xff1b;另一方面&#xff0c;将“智慧城市”的概念引入社…...

【遇见青山】项目难点:缓存穿透的解决方案

【遇见青山】项目难点&#xff1a;缓存穿透的解决方案1.缓存穿透现象缓存空对象布隆过滤其他方案2.解决方案&#xff0c;缓存空数据1.缓存穿透现象 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据…...

单一职责原则|SOLID as a rock

文章目录 意图动机:违反单一职责原则解决方案:C++中单一职责原则的例子单一职责的优点1、可理解性2、可维护性3、可复用性在C++中用好SRP的标准总结本文是关于 SOLID as Rock 设计原则系列的五部分中的第一部分。 SOLID 设计原则侧重于开发 易于维护、可重用和可扩展的软件。…...

使用百度地图官方WEB API,提示 “ APP 服务被禁用“ 问题的解决方法

问题描述 项目上用了百度地图官方WEB API&#xff0c;打开界面时百度地图无法打开&#xff0c;出现弹窗&#xff1a; APP被您禁用啦。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 原因分析&#xff1a; 查看错误信息&#xff1a;"status":240,…...

nodejs如何实现Digest摘要认证?

文章目录1.前言2. 原理3. 过程4. node实现摘要认证5. 前端如何Digest摘要登录认证&#xff08;下面是海康的设备代码&#xff09;1.前言 根据项目需求&#xff0c;海康设备ISAPI协议需要摘要认证&#xff0c;那么什么是摘要认证&#xff1f;估计不少搞到几年的前端连摘要认证都…...

【C#项目】图书馆管理系统-WinForm+MySQL

文章目录前言一、业务梳理与需求分析1.功能描述2.实现步骤3.功能逻辑图二、数据库设计1.实体-关系&#xff08;E-R图&#xff09;概念模型设计2.数据表设计三、WinForm界面交互设计1、界面交互逻辑2、项目树3、主界面登录界面4、 图书查询界面5、图书借阅界面6、图书插入界面7、…...

RNN循环神经网络原理理解

一、基础 正常的神经网络 一般情况下&#xff0c;输入层提供数据&#xff0c;全连接进入隐藏层&#xff0c;隐藏层可以是多层&#xff0c;层与层之间是全连接&#xff0c;最后输出到输出层&#xff1b;通过不断的调整权重参数和偏置参数实现训练的效果。深度学习的网络都是水…...

一句话设计模式1: 单例模式

单例模式:全局唯一的对象。 文章目录 单例模式:全局唯一的对象。前言一、为什么要全局唯一?二、如何实现单例1. 注入到spring中2. 饿汉式3. 懒汉式第一种: 静态内部类第二种: synchronized 关键字第二种: 双重锁检查总结前言 单例可以说是设计模式中很常用的模式了,但也可以说…...

新版国家标准GB/T 28181—2022将于2023年7月1日正式实施,与GB/T 28181—2016差别有哪些?

新版国家标准GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》已于2022年12月30日发布&#xff0c;将于2023年7月1日正式实施。与GB/T 28181—2016相比&#xff0c;除结构调整和编辑性改动外&#xff0c;主要技术变化如下。——更改了标准范围&#xf…...

剑指 Offer 41. 数据流中的中位数

题目 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。 例如&#xff0c;[2,3,4] 的中位数是…...

分布式架构下,Session共享有什么方案?

分布式架构下&#xff0c;Session共享有什么方案&#xff1f; 1.不要有Session&#xff1a;但是确实在某些场景下&#xff0c;是可以没有session的&#xff0c;其实在很多借口类系统当中&#xff0c;都提倡【API无状态服务】&#xff1b; 也就是每一次的接口访问&#xff0c;都…...

瀚博半导体载天VA1 加速卡安装过程

背景&#xff1a; 想用 瀚博半导体载天VA1 加速卡 代替 NVIDIA 显卡跑深度学习模型 感谢瀚博的周工帮助解答。 正文&#xff1a; 小心拔出 NVIDIA 显卡&#xff0c;在PCIe 接口插上瀚博半导体载天VA1加速卡&#xff0c;如图&#xff1a; 这时显示屏连接主板的集成显卡 卸载…...