给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4个子集(5),(1,4),(2,3),(2,3)等于总和。
示例 2:
输入: nums = [1,2,3,4], k = 3
输出: false
该问题python不剪枝的话会超时
主要使用了回溯+剪枝的思想
疯狂试错
每次把元素放到每一个篮子里面试试看
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
total = sum(nums)
if total % k > 0: return False
sub = total // k
nums.sort()
# 问题化简
if nums[-1] > sub:return False
while nums and nums[-1] == sub:
nums.pop()
k -= 1
def dfs(sums):
if not nums:return True
number = nums.pop() #提取元素
for j in range(k): #尝试给每个篮子添加数字
if sums[j] + number > sub:
continue
sums[j] += number
if dfs(sums):
return True
sums[j] -= number
if sums[j] == 0:break
nums.append(number)
return False
return dfs([0 for _ in range(k)])
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets