题目描述:
算法思路:
感觉有桶的思想,定义一个大小为k,初始值为ave的容器
定义递归函数:参数传入,nums,k,nums的当前下标(地方时,从最后一个index进行传入),以及bucket。
递归结束条件为:当cur当前的下标小于0说明递归结束,返回true
剪枝操作:当数组的cur指向的值等于桶i的大小,或者桶i的大小减去数组cur指向的值大于等于nums数组最小值的时候(两者相减比最小值还小,说明这个桶肯定不能构成ave),进行下面的操作。
满足上面的条件的情况下,将nums[cur]加入bucket[i]中,bucket[i]减去相应的值,递归下一个元素。
回溯恢复桶的状态 bucket[i]+=nums[cur]
代码实现:
class Solution {
public:
bool dfs(vector<int>& nums, int k,int cur,vector<int>& bucket){
//递归结束条件
if(cur<0){
return true;
}
for(int i=0;i<k;i++){
if(bucket[i]==nums[cur]||bucket[i]-nums[cur]>=nums[0]){
bucket[i]-=nums[cur];
if(dfs(nums,k,cur-1,bucket)){
return true;
}
//回溯
bucket[i]+=nums[cur];
}
}
return false;
}
bool canPartitionKSubsets(vector<int>& nums, int k) {
int ave;
int sum=0;
for(auto &num:nums){
sum+=num;
}
if(sum%k){
return false;
}
ave=sum/k;
vector<int> bucket(k,ave);
sort(nums.begin(),nums.end());
return dfs(nums,k,nums.size()-1,bucket);
}
};