416. 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
- 每个数组中的元素不会超过 100
- 数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5] 输出: false 解释: 数组不能分割成两个元素和相等的子集.
解题思路:这道题好难啊我觉得,看了别人的答案,使用深度优先搜索求解。先对nums数组进行排序,然后使用target数组存储我们需要的目标值。遍历已排序的nums,若nums[i] <= 目标值,则更新目标值,判断目标值是否为0,若为0,直接返回True,否则递归判断下一个nums元素。若遍历结束,说明此情况不满足题意,返回False。
这道题其实和回溯法很像,区别在于找到一个解直接返回,不需要找到所有的解。状态空间如下图:
Python3代码如下:
class Solution(object):
def canPartition(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
sum_nums = sum(nums)
div,mod = divmod(sum_nums,2)
if mod:
return False
target = [div]*2
nums.sort(reverse=True)
return self.dfs(nums,target,0)
def dfs(self,nums,target,index):
for i in range(2):
if nums[index] <= target[i]:
target[i] -= nums[index]
if target[i] == 0 or self.dfs(nums,target,index+1):
return True
target[i] += nums[index]
return False