Description Link to heading
698.partition-to-k-equal-sum-subsets
Solution Link to heading
Sort array from large to small, so that we can avoid making mistake of judging arrays like [1, 1, 2, 2].
We use used[i]
to avoid using the same element more than once, if sum == target
, sum = 0
, if cnt == k
, than it can be devided.
Code Link to heading
class Solution {
public:
bool dfs(vector<int> &nums, int index, int sum, int target, int cnt, int k, vector<int> &used, int idx) {
if (cnt == k)
return true;
if (sum == target) {
return dfs(nums, idx - 1, 0, target, cnt + 1, k, used, idx - 1); // pay attention to the `idx - 1` rather than `index - 1`
}
for (int i = index; i >= 0; i--) {
if (used[i] || sum + nums[i] > target)
continue;
used[i] = 1;
if (dfs(nums, i - 1, sum + nums[i], target, cnt, k, used, idx))
return true;
used[i] = 0;
if (sum == 0)
return false;
}
return false;
}
bool canPartitionKSubsets(vector<int> &nums, int k) {
int sum = 0;
for (int i : nums)
sum += i;
if (sum % k != 0)
return false;
std::sort(nums.begin(), nums.end());
if (nums.back() > sum / k)
return false;
vector<int> used(nums.size(), 0);
return dfs(nums, nums.size() - 1, 0, sum / k, 0, k, used, nums.size() - 1);
}
};