题目链接:https://leetcode.cn/problems/partition-to-k-equal-sum-subsets/
C++ 代码如下:
class Solution {
public:
int target;
vector<bool> st;
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % k != 0) return false;
target = sum / k;
st.resize(nums.size());
// 剪枝1:从大到小枚举
sort(nums.begin(), nums.end(), greater<int>());
return dfs(nums, k, 0, 0);
}
bool dfs(vector<int>& nums, int k, int start, int cursum) {
if (k == 0) return true;
if (cursum == target) return dfs(nums, k - 1, 0, 0);
for (int i = start; i < nums.size(); i++) {
if (st[i] == true) continue;
if (cursum + nums[i] <= target) {
st[i] = true;
if (dfs(nums, k, i + 1, cursum + nums[i])) return true;
st[i] = false;
}
// 剪枝2:如果nums[i]失败,那么后面所有和它相同的数都失败
while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++;
// 剪枝3:如果当前组第一个数失败,那么最终一定失败
// 剪枝4:如果当前组最后一个数失败,那么最终一定失败
if (cursum == 0 || cursum + nums[i] == target) return false;
}
return false;
}
};