You are given an integer array nums and an integer k, return true if it is possible to divide this array into k non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [2,4,1,3,5], k = 3
Output: trueExplanation: Given array can be divided into three subsets [5], [2,3], [4,1].
Example 2:
Input: nums = [1,2,3,4], k = 3
Output: falseConstraints:
1 <= k <= nums.length <= 161 <= nums[i] <= 10,000[1, 4].class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
if sum(nums) % k != 0:
return False
nums.sort(reverse=True)
target = sum(nums) // k
used = [False] * len(nums)
def backtrack(i, k, subsetSum):
if k == 0:
return True
if subsetSum == target:
return backtrack(0, k - 1, 0)
for j in range(i, len(nums)):
if used[j] or subsetSum + nums[j] > target:
continue
used[j] = True
if backtrack(j + 1, k, subsetSum + nums[j]):
return True
used[j] = False
return False
return backtrack(0, k, 0)Where is the size of the array and is the number of subsets.
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
total = sum(nums)
if total % k != 0:
return False
nums.sort(reverse=True)
target = total // k
used = [False] * len(nums)
def backtrack(i, k, subsetSum):
if k == 0:
return True
if subsetSum == target:
return backtrack(0, k - 1, 0)
for j in range(i, len(nums)):
if used[j] or subsetSum + nums[j] > target:
continue
used[j] = True
if backtrack(j + 1, k, subsetSum + nums[j]):
return True
used[j] = False
if subsetSum == 0: # Pruning
return False
return False
return backtrack(0, k, 0)Where is the size of the array and is the number of subsets.
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
total = sum(nums)
if total % k != 0:
return False
nums.sort(reverse=True)
target = total // k
n = len(nums)
def backtrack(i, k, subsetSum, mask):
if k == 0:
return True
if subsetSum == target:
return backtrack(0, k - 1, 0, mask)
for j in range(i, n):
if (mask & (1 << j)) == 0 or subsetSum + nums[j] > target:
continue
if backtrack(j + 1, k, subsetSum + nums[j], mask ^ (1 << j)):
return True
if subsetSum == 0:
return False
return False
return backtrack(0, k, 0, (1 << n) - 1)Where is the size of the array and is the number of subsets.
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
total = sum(nums)
if total % k != 0:
return False
nums.sort(reverse=True)
target = total // k
n = len(nums)
dp = [None] * (1 << n)
def backtrack(i, k, subsetSum, mask):
if dp[mask] != None:
return dp[mask]
if k == 0:
dp[mask] = True
return True
if subsetSum == target:
dp[mask] = backtrack(0, k - 1, 0, mask)
return dp[mask]
for j in range(i, n):
if (mask & (1 << j)) == 0 or subsetSum + nums[j] > target:
continue
if backtrack(j + 1, k, subsetSum + nums[j], mask ^ (1 << j)):
dp[mask] = True
return True
if subsetSum == 0:
dp[mask] = False
return dp[mask]
dp[mask] = False
return False
return backtrack(0, k, 0, (1 << n) - 1)class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
total = sum(nums)
if total % k != 0:
return False
target = total // k
n = len(nums)
N = 1 << n
dp = [0] + [-1] * (N - 1)
for mask in range(N):
if dp[mask] == -1:
continue
for i in range(n):
if (mask & (1 << i)) == 0 and dp[mask] + nums[i] <= target:
dp[mask | (1 << i)] = (dp[mask] + nums[i]) % target
return dp[N - 1] == 0