mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-08-06 18:24:23 +08:00
1.4 KiB
1.4 KiB
使用回溯法,首先要明确这是组合问题,即集合里是不强调顺序的,所以要用startIndex
class Solution {
private:
bool backtracking(vector<int>& nums,
int k,
int target, // 子集目标和
int cur, // 当前目标和
int startIndex, // 起始位置
vector<bool>& used) { // 标记是否使用过
if (k == 0) return true; // 找到了k个相同子集
if (cur == target) { // 发现一个合格子集,然后重新开始寻找
return backtracking(nums, k - 1, target, 0, 0, used); // k-1
}
for (int i = startIndex; i < nums.size(); i++) {
if (cur + nums[i] <= target && !used[i]) {
used[i] = true;
if (backtracking(nums, k, target, cur + nums[i], i + 1, used)) {
return true;
}
used[i] = false;
}
}
return false;
}
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
//sort(nums.begin(), nums.end()); 不需要排序
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % k != 0) return false;
int target = sum / k;
vector<bool> used(nums.size(), false);
return backtracking(nums, k, target, 0, 0, used);
}
};