LeetCode 416. 分割等和子集
416. 分割等和子集
解题思路
问题转化
这道题本质上是 0-1 背包问题 的变体。
- 首先计算数组所有元素的总和
sum。 - 如果
sum是奇数,显然无法分成两个相等的整数和子集,直接返回false。 - 如果
sum是偶数,令target = sum / 2。问题转化为:能否从数组中选出一些数字,使其和恰好为target。
动态规划
状态定义:
dp[i]表示是否存在一个子集,其元素之和为i。转移思路:
遍历数组中的每个数字num,基于上一轮的dp状态,更新当前可能达到的和。
如果dp[i]为true(即存在和为i的子集),那么加上当前数字num后,和i + num也是可以达成的。初始化:
dp[0] = true,表示和为 0 总是可以实现的(即不选任何元素)。最终结果:
如果dp[target]为true,说明找到了和为target的子集,返回true。
参考代码
从前往后遍历
1 | |
从后往前遍历
1 | |
LeetCode 416. 分割等和子集
https://sowink.cn/2026/02/08/LeetCode-416-分割等和子集/