力扣HOT100之动态规划:416. 分割等和子集

article/2025/7/28 1:34:01


这道题之前刷过代码随想录,现在只能想起一点点思路,最后还是去看视频了。这道题用二维dp数组或者一维dp数组都可以做,这篇博客把两种思路都讲一下。

二维dp数组做法

原问题可以抽象为:容量为sum / 2的背包能否用数组中的物品填满?我们将重量与价值1:1转换,问题可以进一步转换为:容量为sum / 2的背包所能取到的最大价值能否达到sum / 2
这样一来,原来的数组分割问题就变成了0-1背包问题,我们开始动规五部曲:
1.确定dp[i][j]的含义:背包容量为i的情况下,考虑下标[0 ~ j]的物品,所能取到的最大价值为dp[i][j]
2.确定递推公式 dp[i][j] = max(dp[i][j - 1], dp[i - nums[j]][j - 1] + nums[j]);
3.dp数组初始化 dp[0][j] = 0; dp[i][0] = i < nums[0] ? 0 : nums[0];
4.确定遍历顺序:先背包后物品(可以颠倒)
5.打印数组(省略)
这里并不涉及排列组合的问题,因此先遍历背包还是先遍历物品都无所谓。二维dp数组的做法有点在于便于理解,但是缺点在于复杂度过高,程序耗时较多。

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = accumulate(nums.begin(), nums.end(), 0);   //计算数组元素总和if(sum % 2 == 1) return false;   //若总和为奇数则直接跳过,一定分不出来sum /= 2;   //原问题可以抽象为:容量为sum / 2的背包能否用数组中的物品填满//将重量与价值1:1转换,可以转换为:容量为sum / 2的背包所能取到的最大价值能否达到sum / 2//1.确定dp[i][j]的含义:背包容量为i的情况下,考虑下标[0 ~ j]的物品,所能取到的最大价值为dp[i][j]//2.确定递推公式  dp[i][j] = max(dp[i][j - 1], dp[i - nums[j]][j - 1] + nums[j]);//3.dp数组初始化 dp[0][j] = 0; dp[i][0] = i < nums[0] ? 0 : nums[0];//4.确定遍历顺序:先背包后物品(可以颠倒)//5.打印数组(省略)int m = sum + 1;   //背包容量0 ~ sumint n = nums.size();   //物品0 ~ n - 1vector<vector<int>> dp(m, vector<int>(n, 0));//初始化for(int i = 0; i < m; i++)dp[i][0] = (i < nums[0] ? 0 : nums[0]);for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){if(i < nums[j]){   //背包容量为i时不足以装下物品jdp[i][j] = dp[i][j - 1];continue; }dp[i][j] = max(dp[i][j - 1], dp[i - nums[j]][j - 1] + nums[j]);if(dp[i][j] == sum) return true;}}return false;}
};

一维dp数组做法

一维dp数组实际上就是将二维dp数组压缩成了一维dp数组,在遍历顺序上非常有讲究,首先我们先给出一维dp数组的动规五部曲:
1.确定dp[i]的含义:背包容量为i的情况下,所能取到的最大价值为dp[i]
2.确定递推公式 dp[i] = max(dp[i], dp[i - nums[j]] + nums[j]);
3.dp数组初始化 dp[0] = 0;
4.确定遍历顺序:先物品后背包,背包必须倒序遍历,否则物品会重复添加(不可颠倒)
5.打印数组(省略)
在二维dp数组中,先遍历背包还是先遍历物品都是可以的,这是因为我们dp数组的推导来源于上一层或者左边,都是基于已经填好的值,那些填好的值不会再变动,因此无所谓遍历顺序,但是我们将其压缩为一维dp数组后,我们需要不断修改一维dp数组中的值,且我们每推导一次dp数组的值,都来源于二维dp数组的上一层或者左边,如果背包容量依然从小到大遍历,那么可能会出现物品被重复添加的情况,可以看一下卡哥的这期视频,有详细的反例。只有从大到小遍历背包,才能保证物品只被添加一次。至于为什么一定要先遍历物品再遍历背包,原因也很简单,我们使用一维dp数组来压缩状态,那么这个过程应该为:我们不断地增加可供添加的物品的数量,并分别讨论背包在不同容量下对于不同物品数量的情况下所能取到的最大价值,但是如果遍历顺序反过来,就变成了:我们不断减小背包的容量,并分别讨论此时背包所能装下物品的最大价值(因为是倒序遍历,背包较小的情况可能还没准备好),这就会导致计算出来的结果不对。

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = accumulate(nums.begin(), nums.end(), 0);   //计算数组元素总和if(sum % 2 == 1) return false;   //若总和为奇数则直接跳过,一定分不出来sum /= 2;   //原问题可以抽象为:容量为sum / 2的背包能否用数组中的物品填满//将重量与价值1:1转换,可以转换为:容量为sum / 2的背包所能取到的最大价值能否达到sum / 2//1.确定dp[i]的含义:背包容量为i的情况下,所能取到的最大价值为dp[i]//2.确定递推公式  dp[i] = max(dp[i], dp[i - nums[j]] + nums[j]);//3.dp数组初始化 dp[0] = 0;//4.确定遍历顺序:先物品后背包,背包必须倒序遍历,否则物品会重复添加(不可颠倒)//5.打印数组(省略)int m = sum + 1;   //背包容量0 ~ sumint n = nums.size();   //物品0 ~ n - 1vector<int> dp(m, 0);for(int j = 0; j < n; j++){for(int i = m - 1; i >= nums[j]; i--){dp[i] = max(dp[i], dp[i - nums[j]] + nums[j]);if(dp[i] == sum) return true;}}return false;}
};

http://www.hkcw.cn/article/kBEplTlmTg.shtml

相关文章

【学习笔记】Sparse Crosscoders for Cross-Layer Features and Model Diffing

Sparse Crosscoders for Cross-Layer Features and Model Diffing Abstract 本说明介绍了稀疏跨编码器(sparse crosscoders)&#xff0c;它是一种稀疏自编码器(sparse autoencoders)或transcoders的变体&#xff0c;旨在用于理解叠加中的模型结构。SAEs是在单一层中编码和预测…

Python UV 环境下的 PyKDL 运动学库安装

视频讲解&#xff1a; Python UV 环境下的 PyKDL 运动学库安装 mujoco-learning这个仓库&#xff0c;改成uv管理环境依赖后&#xff0c;原来的一些包有些缺失&#xff0c;比如之前安装的PyKDL&#xff0c;于是把这部分补进来~ 结合《PyKDL 运动学动力学库-安装&#xff08;源码…

Linux驱动之平台总线

Linux驱动之平台总线 参考视频地址 【北京迅为】嵌入式学习之Linux驱动&#xff08;第六期_平台总线_全新升级&#xff09;_基于RK3568_哔哩哔哩_bilibili 平台总线介绍 一、什么是平台总线模型&#xff1f; ​ 平台总线模型也叫platform总线模型。平台总线是Linux系统虚拟…

《Python语言程序设计》2018 第4章第9题3重量和价钱的对比,利用第7章的概念来解答你

利用类来解答这个问题。 pack1, price1 50, 24.59 pack2, price2 25, 11.99class result:def __init__(self,pack,price):self.pack packself.price pricedef set_pack(self):return self.packdef set_price(self):return self.pricedef get_result(self):return self.pric…

Parametric Retrieval Augmented Generation

Parametric Retrieval Augmented Generation 3. Methodology 3.1 Problem Formulation and Overview 文中原始符号数学表示额外解释LLM L L L大模型的简化表示LLM parameters θ \theta θ大模型的参数表示user query q q q用户的输入external corpus K K K K { d 1 , d 2 ,…

8088 单板机 汇编 NMI 中断程序示例 (脱离 DOS 环境)

; ; nmi_demo.asm - 8088 单板机 NMI 中断演示程序 ; 脱离 DOS 环境&#xff0c;直接运行在裸机上 ; ; 硬件配置假设: ; - 8088 CPU 4.77MHz ; - 8259 PIC (可编程中断控制器) ; - 8255 PPI (可编程外设接口) 连接 LED ; - 7 段数码管显示 ; - NMI 按钮连接到 NMI 引脚PORT_P…

HRMS数据模型:解密组织的数字基因库与智能管理引擎

摘要 随着数字化转型浪潮席卷全球&#xff0c;人力资源管理系统&#xff08;HRMS&#xff09;正升级为企业的“数字基因库”&#xff0c;承载着组织、岗位与人员的动态管理使命。本文基于创新的“三维动态耦合模型”&#xff0c;系统剖析HRMS数据模型设计理念、关键组件与业务…

Nature|张泽民团队提出CM模型新视角 | 单细胞如何走向系统生态?|细胞模块概念新研究范式

端午节儿童节&#xff0c;假期到了&#xff0c;不知道大家有没有安排出游&#xff0c;去哪里放松、吃到什么特别的美食&#xff1f;长大之后&#xff0c;儿童节就悄悄地从我们的生活中“毕业”了&#xff0c;忙碌中偶尔的童心和好奇&#xff0c;还是要有的。 今天分享最近学习…

题单:最大公约数(辗转相除法)

题目描述 所谓 “最大公约数&#xff08;GCD&#xff09;” &#xff0c;是指所有公约数中最大的那个&#xff0c;例如 12 和 1818 的公约数有 1,2,3,6 &#xff0c;所以 12 和 18 的最大公约数为 6 。 辗转相除法&#xff0c;又名欧几里德算法&#xff08;Euclidean Algorit…

75岁薛家燕谈小17岁男友 甜蜜恋情持续12年

近日,75岁的资深艺人薛家燕在接受采访时谈及与小17岁男友Andy的恋情,难掩甜蜜。她表示男友多年来对她一直很好。两人通过朋友介绍相识,最初通过电子邮件交流。薛家燕曾因年龄差距犹豫退缩,担心对方只是一时喜欢,甚至一度提出分手。但Andy以真诚打动了她,两人相恋12年,尽…

女子骑电动三轮闯卡强行上高速 收费站工作人员尽力拦截未果

5月31日,有网友在抖音平台发布了一段行车记录仪视频。视频显示,在陕西省渭南市华州收费站,一名女子骑着电动三轮车强行闯卡驶上了高速公路。根据视频内容,当天下午6点45分左右,这名女子骑着电动三轮车紧跟在一辆汽车后面。收费站工作人员发现后,试图让她退回去,但她并未…

新规施行拒绝刷脸有依据了 保护个人信息安全

近年来,刷脸技术在识别个人信息方面的应用日益广泛,从小区门禁、酒店登记到交通出行和金融支付,在经济社会的各个领域几乎都能见到“刷脸”技术的应用。然而,这种便捷性背后也隐藏着不容忽视的风险。为规范人脸识别技术的使用并保护个人信息安全,国家互联网信息办公室和公…

河南水库水位下降现千佛石窟 佛像多有残损引发关注

近日,河南省鹤壁市淇县夺丰水库水位下降后,一处千佛石窟显露出来,引发网友关注。该石窟洞壁布满佛像,但不少佛头和手臂几乎都消失不见。淇县县委宣传部一负责人表示,这处石窟当地人一直都知道,民间称其为天竺石窟或千佛洞。该负责人曾在十多年前两次进入石窟参观。夺丰水…

郑钦文回应晋级:再打两盘都没问题 体力充沛信心足

郑钦文鏖战3盘,耗时2小时47分钟,以2-1击败萨姆索诺娃,晋级法网女单8强,刷新了个人在法网的最佳战绩。赛后接受采访时,她表示自己还有很多能量,甚至开玩笑说如果女子比赛有五盘制,她再打两盘也没问题。这场比赛非常激烈,对手发挥出色,给郑钦文施加了很大压力,她在底线…

当地称瘦弱骆驼主人此前已养死一只 另一只现状堪忧

近日,多名网友在社交平台上发帖称,在福建省福州市平潭县流水镇路边发现一只疑似被遗弃的骆驼。这只骆驼体型瘦弱,趴伏在地上,毛发稀疏,周围没有任何遮蔽,引起了广泛关注。6月1日,一名当地居民表示,5月9日她曾路过该路段,看到有两只骆驼趴在路边;今天早上再去查看时,…

现场球迷合唱《日不落》送给郑钦文 法网晋级喜迎海鲜大餐

5月31日,中国选手郑钦文在2025年法国网球公开赛32强战中表现出色,以6-3、6-4直落两盘击败18岁的加拿大资格赛黑马姆博科,挺进16强,追平个人纪录。比赛结束后,她在巴黎街头漫步并享受了一顿海鲜大餐。首盘比赛中,郑钦文发球状态极佳,一发得分率达78%,轰出3记ACE球,并通…

12.springCloud AlibabaSentinel实现熔断与限流

目录 一、Sentinel简介 1.官网 2.Sentinel 是什么 3.Sentinel 的历史 4.Sentinel 基本概念 资源 规则 5.Sentinel 功能和设计理念 (1).流量控制 什么是流量控制 流量控制设计理念 (2).断降级 什么是熔断降级 熔断降级设计理念 (3).系统自适应保护 6.主要工作机制…

【GPT入门】第40课 vllm与ollama特性对比,与模型部署

【GPT入门】第40课 vllm与ollama特性对比&#xff0c;与模型部署 1.两种部署1.1 vllm与ollama特性对比2. vllm部署2.1 服务器准备2.1 下载模型2.2 提供模型服务 1.两种部署 1.1 vllm与ollama特性对比 2. vllm部署 2.1 服务器准备 在autodl 等大模型服务器提供商&#xff0c;…

PTA-根据已有类Worker,使用LinkedList编写一个WorkerList类,实现计算所有工人总工资的功能。

目录 1.问题描述 2.函数接口定义&#xff1a; 3.裁判测试程序样例&#xff1a; 4.输入和输出样例 输入样例&#xff1a; 输出样例&#xff1a; 5.实现代码 1.问题描述 Main类&#xff1a;在main方法中&#xff0c;调用constructWorkerList方法构建一个Worker对象链表…

Maven概述,搭建,使用

一.Maven概述 Maven是Apache软件基金会的一个开源项目,是一个有优秀的项目构建(创建)工具,它用来帮助开发者管理项目中的jar,以及jar之间的依赖关系,完成项目的编译,测试,打包和发布等工作. 我在当前学习阶段遇到过的jar文件: MySQL官方提供的JDBC驱动文件,通常命名为mysql-…