news 2026/4/20 23:50:40

【Hot 100 刷题计划】 LeetCode 416. 分割等和子集 | C++ 0-1背包 1D空间极致优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Hot 100 刷题计划】 LeetCode 416. 分割等和子集 | C++ 0-1背包 1D空间极致优化

LeetCode 416. 分割等和子集

📌 题目描述

题目级别:中等

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

  • 示例 1:
    输入:nums = [1,5,11,5]
    输出:true
    解释:数组可以分割成[1, 5, 5][11]

  • 示例 2:
    输入:nums = [1,2,3,5]
    输出:false
    解释:数组不能分割成两个元素和相等的子集。


💡 破题思路:转化为 0-1 背包问题

这道题表面上是“分割数组”,但稍加数学转化就能看穿它的本质:
如果数组能够被平分成和相等的两份,那么整个数组的总和sum必须是偶数,且我们要在数组中挑出一部分数字,使得它们的和恰好等于sum / 2

这就完美契合了0-1 背包问题的模型:

  • 背包总容量target = sum / 2
  • 物品:数组中的每个数字nums[i]
  • 物品重量:数字本身的大小。
  • 物品价值:依然是数字本身的大小(本题只需关心能否装满,不需要价值最大化,布尔值即可)。
  • 核心限制:每个数字只能使用一次(0-1 背包)。

本解法高光点(状态压缩与倒序遍历):
传统的二维背包需要dp[i][j]记录前i个物品凑成重量j的状态。
但实际上,我们在计算第i行时,仅仅依赖于第i-1行的数据。因此,我们可以直接把二维数组压缩成一维数组dp[j]
⚠️ 致命细节:在一维数组中,内层循环遍历容量j时,必须从大到小倒序遍历!如果正序遍历,我们在计算dp[j]时,用到的dp[j - nums[i]]可能在这一轮已经被当前物品更新过了,导致一个物品被重复放入(那就变成完全背包了)。倒序遍历完美保证了每个物品只被放入一次。


💻 C++ 代码实现 (满分标准模板)

classSolution{public:boolcanPartition(vector<int>&nums){intn=nums.size();intsum=0,ma=0;// 1. 计算总和并寻找最大元素for(inti=0;i<n;i++){sum+=nums[i];ma=max(ma,nums[i]);}// 2. 极致剪枝 (大厂面试加分项)// 如果总和是奇数,绝对不可能平分if(sum%2!=0)returnfalse;inttarget=sum/2;// 如果数组中最大的元素直接比目标和还要大,那肯定凑不出来if(ma>target)returnfalse;// 3. 一维 DP 数组// dp[j] 表示能否从数组中挑选出和为 j 的子集vector<bool>dp(target+1,false);// 核心起跑点:什么都不挑,凑出和为 0 永远是 Truedp[0]=true;// 外层循环:遍历每一个数字 (物品)for(inti=0;i<n;i++){// 内层循环:遍历背包容量。必须【倒序】,防止数字被重复使用!// 优化:j 只需要遍历到 nums[i],因为比 nums[i] 还小的容量根本装不下当前物品for(intj=target;j>=nums[i];j--){// 状态转移:能否凑出 j,取决于原来就能凑出 j,或者能凑出 (j - 当前数字)dp[j]=dp[j]||dp[j-nums[i]];}}returndp[target];}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 23:50:39

精准掌握战斗节奏:GBFR Logs 实时DPS监控与数据分析全指南

精准掌握战斗节奏&#xff1a;GBFR Logs 实时DPS监控与数据分析全指南 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbfr-logs …

作者头像 李华
网站建设 2026/4/20 23:50:28

大语言模型 (LLM) 零基础入门:核心原理、训练机制与能力全解

上篇文章&#xff1a;面试官灵魂拷问&#xff1a;Linux软链接与硬链接到底有什么区别&#xff1f;&#xff08;附底层Inode级深度图解&#xff09; 目录 1.认识模型 2.认识大语言模型 2.1什么是大语言模型 1. 神经网络&#xff1a;高效的“条件反射链” 2. 自监督学习&am…

作者头像 李华
网站建设 2026/4/20 23:49:23

GitHub 热榜日报

热门项目&#xff1a;FinceptTerminal以6,582星登顶&#xff0c;提供金融数据分析工具&#xff1b;OpenAI的多代理框架openai-agents-python以23,186星位居第四&#xff1b;文档管理系统paperless-ngx以38,875星排名第六&#xff1b;AI领域亮点包括thunderbird的自主AI工具(2,2…

作者头像 李华
网站建设 2026/4/20 23:41:15

工业物联网实战:用STM32F407+FreeModbus RTU打造一个稳定的Modbus从站设备

工业物联网实战&#xff1a;用STM32F407FreeModbus RTU打造高可靠Modbus从站设备 在工业自动化领域&#xff0c;Modbus协议因其简单可靠的特点&#xff0c;已成为设备间通信的事实标准。本文将深入探讨如何基于STM32F407微控制器和FreeModbus开源库&#xff0c;构建一个适用于严…

作者头像 李华