代码随想录算法训练营Day41 | 0-1背包理论基础、416.分割等和子集

0-1背包理论基础

基础

DP数组与其下标的含义

dp[i][j],i为物品编号,j为背包容量

dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

递推公式

分类:是否要放入下标为i的物品:

· 不放时最大价值为:dp[i - 1][j]

· 放入时最大价值为:dp[i - 1][j – weight[i]] + value[i]

递推取两者较大值:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j – weight[i]] + value[i])

DP数组初始化

dp[i][j]由其上方格子和左上方范围内某一个格子初始化而来,所以需要初始化最上的一行最左的一列

        i = 0时,对于j < weight[0]的格子,初始化为0,往后的格子初始化为value[0]

        j = 0时,背包容量为0,装不下任何物品,所以最左列全部初始化为0

遍历顺序

先遍历物品(i)或先遍历背包(j)都可以,都能将dp数组填满

滚动数组优化

因为dp[i][j]的值只由i-1行元素推出,所以dp数组可以使用一维滚动数组来代替二维数组

注意使用滚动数组时不能先遍历背包,只能先遍历物品。遍历物品时遍历背包的顺序应该从右到左(思考一下覆盖的顺序)


416.分割等和子集

(这题其实没有提示挺难想到背包解法的,告诉我是背包题也想了半天)

这题用背包解得想明白 j 是什么:寻找两个总和相等的子集,等价于寻找一个和为所以数总和一半的子集,所以 j 是数的总和,而 j 的最大值应该是数组中所有数总和的一半

1、DP数组定义:一维数组,使用滚动数组来实现背包。方便理解使用二维数组来解释定义:dp[i][j]表示 n = i 时,数组下标[0, i]中取任意数所能得到的最大值,这个最大值不能超过j

        · weight[i] 和 value[i] 都等于 nums[i]

        · value[i] == nums[i] 使在遍历物品时不断取到最大值

        · weight[i] == nums[i] 使在遍历背包时最大值不超过总和的一半

        · 最后遍历完了所有物品和背包后,如果dp[-1][-1] == 总和的一半,说明能恰好取到一个子集,其总和为所有数总和的一半

2、DP数组初始化:i < nums[0]的格子,初始化为0,往后的格子初始化为value[0]

3、递推公式:常规0-1背包问题的递推公式(滚动数组实现):
        dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);

bool canPartition(vector<int>& nums) {int sum = 0;for (int n : nums)sum += n;if (sum % 2 == 1)return false;// weight[i]与value[i]都设置为nums[i]// 当背包大小为sum / 2时,看最大数总和是否也是sum / 2sum /= 2;vector<int> dp(sum + 1, 0);for (int j = 0; j < sum + 1; ++j)if (j >= nums[0]) dp[j] = nums[0];for (int i = 1; i < nums.size(); ++i) {for (int j = sum; j >= nums[i]; --j) {dp[j] = std::max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[sum] == sum;
}

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

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

相关文章

typescript 实现Optional

我们先看下面的这段代码,一个学生接口,里面有成员id,name,age,gender等等成员, 有一个方法graduate,里面要接受一个Student类型的实参 interface Student {id: numbername: stringage: numbergender: string}function graduate(Student: Student) {//...}现在有一个问题,就是学…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

vue导致页面加载白屏时间长的原因有哪些,怎么优化

写在前面&#xff1a;vue是单页面应用&#xff0c;默认index.html里只要一个空的div。需要将所有的资源都下载到浏览器端进行解析。当网速较差时会出现一定程度的白屏。 什么是白屏时间 白屏时间是指用户输入内容回车到浏览器开始出现第一个字符,也就是说(页面)开始显示内容的时…

2583. 二叉树中的第 K 大层和

2583. 二叉树中的第 K 大层和 题目链接&#xff1a;2583. 二叉树中的第 K 大层和 代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), …

【笔记】【电子科大 离散数学】 2.命题

文章目录 数理逻辑定义 命题定义不是命题的例子 原子命题和复合命题定义约定 命题联结词否定联结词定义例子真值表 合取联结词定义例子真值表 析取联结词定义例子 蕴含联结词定义例子真值表 等价联结词定义例子真值表 命题符号化及其应用速查表格优先级复合命题符号化布尔检索演…

15.4K Star,超强在线编辑器

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 今天推荐一款非常棒的开源实时协作编辑器&#xff0c;可用于多人同时编…

每日OJ题_分治快排①_力扣75. 颜色分类(快排原理)

目录 分治快排算法原理 力扣75. 颜色分类 解析代码 分治快排算法原理 分治就是分而治之&#xff0c;快排在数据结构也学过了&#xff0c;现在来学一学三路划分快排&#xff08;数组划分三块&#xff09;&#xff1a; 前面我们已经实现了三个版本的快速排序的算法&#xff0…

babylonjs中文文档

经过咨询官方&#xff0c;文档已经添加了开源协议。 基于目前babylonjs没有中文文档&#xff0c;为了打造更好的babylonjs生态圈 &#xff0c;特和小伙伴们翻译了官方文档。 相关链接: 欢迎加群&#xff1a;464146715 官方文档 中文文档 Babylonjs案例分享

选座位 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 疫情期间&#xff0c;需要大家保证一定的社交距离&#xff0c;公司组织开交流会议&#xff0c;座位有一排共N个座位&#xff0c;编号分别为[0…N-1]&#xff0c;要…

【SpringBoot】Spring常用注解总结

目录 ⭐spring springmvc和springboot的区别 Autowired 和Resource的区别和联系 1. SpringBootApplication 2. Spring Bean 相关 2.1. Autowired 2.2. Component,Repository,Service, Controller 2.3. RestController 2.4. Scope 2.5. Configuration 3. 处理常见的 HT…

Java客户端调用Websocket服务端(Springboot)

代码示例 步骤1 今天使用Java客户端调用Websocket服务端 以下是客户端代码&#xff1a; import com.sinosoft.springbootplus.lft.business.dispatch.map.application.service.impl.LawEnforceSosServiceImpl; import com.sinosoft.springbootplus.lft.business.dispatch.ma…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

C语言编程风格规范-1

目的 良好的代码编写风格是高质量代码的一部分,统一的、良好的代码编写规范,使代码更具可读性与可维护性。本文综合了国内各大厂的编码规范,各取各大厂的各规范中的要点与精华,汇聚成此文档。 文件 2.1 所有文件统一使用 utf-8 编码 2.2 包含头文件时,建议相同模块的头文件…

Docker的常用命令

Docker的常用命令 Docker是一个开源的应用容器引擎&#xff0c;它使得开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间没有任何接口&#xff…

正版IDM多少钱?如何便宜购买序列号

IDM是一款互联网下载神器&#xff0c;它的全称是Internet Download Manager&#xff0c;可以将下载速度提升至5倍以上。那么IDM正版多少钱&#xff1f;如何才能买到正版IDM序列号呢&#xff1f; 正版IDM的价格根据付费模式和购买渠道不同&#xff0c;所需要的价格也是不同的。…

挑战30天学完Python:Day20 PIP 包管理

&#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点知识&#xff0c;但又没…

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

Vue3 学习笔记(Day4)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. Vue3 学习笔记&#xff08;Day1&#xff09; 2. Vue3 学习笔记&#xff08;Day2&…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

信息学奥赛一本通1205:汉诺塔问题

1205&#xff1a;汉诺塔问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 47778 通过数: 18652 【题目描述】 约19世纪末&#xff0c;在欧州的商店中出售一种智力玩具&#xff0c;在一块铜板上有三根杆&#xff0c;最左边的杆上自上而下、由小到大顺序串着由64…