LeetCode百题【分割等和子集】
题目描述
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
1 | |
示例 2:
1 | |
提示:
1 <= nums.length <= 2001 <= nums[i] <= 100
解法
动态规划
将问题转换为:判断是否可以从数组中选出一些数字,使得这些数字的和等于整个数组的元素和的一半
特殊判断
- 元素个数>2
- 元素和为偶数
- 数组内不得有单个数>sum/2;
定义
dp[i][j]为表示从数组的[0,i]下标范围内选取若干个正整数(可以是0个),是否存在一种选取方案使得被选取的正整数的和等于 j边界情况
- 如果不选取任何正整数,则被选取的正整数和等于0。因此对于所有
0≤i<n,都有dp[i][0]=true - 当
i==0时,只有一个正整数nums[0]可以被选取,因此dp[0][nums[0]]=true
- 如果不选取任何正整数,则被选取的正整数和等于0。因此对于所有
状态转移方程
当前num>j,不可选,状态由上一个状态转移过来
dp[i][j]=dp[i-1][j];当前num<=j,可选可不选,二者满足一种即可
dp[i][j]=dp[i-1][j] | dp[i-1][j-num];
1 | |
- 时间复杂度:O(n*target)
来源:力扣(LeetCode)
链接:416. 分割等和子集 - 力扣(LeetCode)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 漫漫长夜!




