Partition Problems: Equal Subset Sum and K Equal Parts
Advertisement
Partition Problems
Partition Equal Subset Sum
Decide if array can be split into two equal-sum halves.
def canPartition(nums):
total = sum(nums)
if total % 2: return False
target = total // 2
nums.sort(reverse=True) # large first = better pruning
def bt(idx, remaining):
if remaining == 0: return True
if remaining < 0 or idx >= len(nums): return False
# Skip: if nums[idx] == nums[idx-1], we already tried including nums[idx-1]
if idx > 0 and nums[idx] == nums[idx-1]:
return bt(idx+1, remaining)
return bt(idx+1, remaining-nums[idx]) or bt(idx+1, remaining)
return bt(0, target)
# DP approach O(n * target) — often faster
def canPartitionDP(nums):
total = sum(nums)
if total % 2: return False
target = total // 2
dp = {0}
for n in nums:
dp = dp | {x + n for x in dp}
return target in dp
Partition to K Equal Sum Subsets
def canPartitionKSubsets(nums, k):
total = sum(nums)
if total % k: return False
target = total // k
nums.sort(reverse=True)
if nums[0] > target: return False
buckets = [0] * k
n = len(nums)
def bt(idx):
if idx == n: return True
seen = set()
for b in range(k):
if buckets[b] in seen: continue # skip duplicate bucket states
if buckets[b] + nums[idx] <= target:
seen.add(buckets[b])
buckets[b] += nums[idx]
if bt(idx + 1): return True
buckets[b] -= nums[idx]
return False
return bt(0)
C++ Implementation
#include <bits/stdc++.h>
using namespace std;
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % k) return false;
int target = sum / k;
sort(nums.rbegin(), nums.rend());
if (nums[0] > target) return false;
int n = nums.size();
vector<int> buckets(k, 0);
function<bool(int)> bt = [&](int idx) -> bool {
if (idx == n) return true;
set<int> seen;
for (int b = 0; b < k; b++) {
if (seen.count(buckets[b])) continue;
if (buckets[b] + nums[idx] <= target) {
seen.insert(buckets[b]);
buckets[b] += nums[idx];
if (bt(idx + 1)) return true;
buckets[b] -= nums[idx];
}
}
return false;
};
return bt(0);
}
LeetCode Problems
- 416. Partition Equal Subset Sum — DP bitset
- 698. Partition to K Equal Sum Subsets — backtracking
- 473. Matchsticks to Square — k=4 subsets
Advertisement