LeetCode:698. 划分为k个相等的子集
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
if (k > nums.size())
return false;
int sum = 0;
for (int v : nums) {
sum += v;
}
// 如果数字不能平分
if (sum % k != 0)
return false;
// 记录每个桶中球的数量和
vector<int> bucket(k, 0);
// 每个桶中球的数量,k是分的组数
int target = sum / k;
// 索引值为0,桶中球的数量,桶中的目标数量
return backtrack(nums, 0, bucket, target);
}
bool backtrack(vector<int>& nums, int index, vector<int>& bucket,
int target) {
if (index == nums.size()) {
// 检查是否符合要求
for (int i = 0; i < bucket.size(); i++) {
if (bucket[i] != target) {
return false;
}
}
return true;
}
//穷举nums[index]选择的桶
for(int i=0;i<bucket.size();i++){
if(bucket[i]+nums[index]>target){
continue;
}
bucket[i]+=nums[index];
if(backtrack(nums, index+1,bucket , target)){
return true;
}
bucket[i]-=nums[index];
}
return false;
}
};
会超时
