题目描述:
LeetCode 698. Partition to K Equal Sum Subsets
Given an array of integers nums and a positive integer k, find whether it's possible to divide this array into k non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 Output: True Explanation: It's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
- 1 <= k <= len(nums) <= 16.
- 0 < nums[i] < 10000.
题目大意:
判断数组nums是否可以划分为k个和相等的子数组
解题思路:
记忆化搜索(Search + Memoization)
Python代码:
class Solution(object):
    def canPartitionKSubsets(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        dmap = {}
        def solve(nums, target, k):
            if k == 1: return sum(nums) == target
            key = (tuple(nums), k)
            if key in dmap: return dmap[key]
            size = len(nums)
            ans = False
            for x in range(1 << size):
                sums = 0
                rest = []
                for y in range(size):
                    if (x >> y) & 1:  sums += nums[y]
                    else: rest.append(nums[y])
                if sums == target and solve(rest, target, k - 1):
                    ans = True
                    break
            dmap[key] = ans
            return ans
        sums = sum(nums)
        if sums % k: return False
        return solve(sorted(nums), sums / k, k)
 本文链接:http://bookshadow.com/weblog/2017/10/15/leetcode-partition-to-k-equal-sum-subsets/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。
