LeetCode百题【分割等和子集】
题目描述
给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
1 |
|
示例 2:
1 |
|
提示:
1 <= nums.length <= 200
1 <= 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 许可协议。转载请注明来自 漫漫长夜!