题目
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
思路
回溯:因为每个元素都要用上,那取到和为target的一组值,就设置total为0重新取。递归终止条件是,当没有值可取且target等于total。一旦找到这样的集合,提前阻断,一直返回True
注意:对nums从大到小排序,如果最大的大于target,直接返回False。节省时间。
class Solution:
def canPartitionKSubsets(self, nums, k):
target = sum(nums) // k
if sum(nums) % k :
return False
nums.sort(reverse=True)
print(nums)
if nums[0] > target:
return False
def dfs(remain, total):
if total == target:
if len(remain) == 0:
return True
return dfs(remain, 0)
for i, n in enumerate(remain):
if (total + n) <= target and dfs(remain[:i]+remain[i+1:], total+n):
return True
return False
return dfs(nums, 0)