目录

0698:划分为k个相等的子集(★)

力扣第 698 题

题目

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

提示:

  • 1 <= k <= len(nums) <= 16
  • 0 < nums[i] < 10000
  • 每个元素的频率在 [1,4] 范围内

相似问题:

分析

0473 升级版,将 4 改为 k 即可。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution:
    def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
        s = sum(nums)
        if s % k:
            return False
        s //= k
        n = len(nums)
        f = [-1]*(1<<n)
        f[0] = 0
        for st in range(1<<n):
            if f[st]>=0:
                for i,x in enumerate(nums):
                    if not st&(1<<i) and f[st]+x<=s:
                        f[st|(1<<i)] = (f[st]+x)%s
        return f[-1] == 0

1281 ms