题目
给定一个整数数组 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
思路
分割等和子集,那就先求和,再平分。如果不能平分,那就直接返回false,否则,问题就变成了判断数组是否存在若干个元素求和正好等于数组和的1/k,那就直接遍历所有的结果,深搜解决.
代码
class Solution:
def canPartitionKSubsets(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
length=len(nums)
sum1= sum(nums)
target= sum1//k
if k<=0 or k>length or sum1%k !=0 or max(nums)>target:
return False
visited=[0 for i in range(length)]
return self.dfs(nums,visited,0,k,0,0,target)
def dfs(self,nums,visited,index,k,cur_sum,cur_num,target):
if k==1:
return True
if cur_sum==target and cur_num>0:
return self.dfs(nums,visited,0,k-1,0,0,target)
if cur_sum>target:
return False
for i in range(index,len(nums)):
if visited[i]==0: