LeetCode 698.划分为k个相等的子集

给定一个整数数组 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

原文地址:https://www.cnblogs.com/sandy-t/p/13188516.html