给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
提示:
1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
target, rem = divmod(sum(nums), k)
if rem!=0:
return False
nums = sorted(nums) ## 先进行排序
print(nums)
cur = [0]*k
return self.canPartitionKSubsets_helper(nums,cur,target)
def canPartitionKSubsets_helper(self,nums,cur,target):
if len(nums) == 0: ## 所有数都安放完成,返回True
return True
num = nums.pop() ## 拿出最大值开始搜索
for i, value in enumerate(cur):
if value + num <= target: ## 如果满足要求递归进行搜索
cur[i]+=num
if self.canPartitionKSubsets_helper(nums,cur,target):
return True
cur[i]-=num ## 递归返回后恢复上一层状态
if value == 0: ## 尽量将0放在最后进行搜索
break
nums.append(num)
return False