leetcode算法题--划分为k个相等的子集★

原题链接:https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets/

相关问题:分隔等和子集

递归的方法其实不难想,但是很难写。很容易想到,求出子集的和sum,然后找出是否存在正好k个子集的和都等于sum。这里的比较有技巧的点是,如果需要k个子集,那么建k个桶groups,每个桶都初始化为sum。接着就进入递归,递归传入初始索引pos从0开始,在递归内部对groups进行循环,当索引pos大于nums范围时,说明所有groups都已经被填满了,因为nums的和一定是等于groups的和。

bool canPartitionKSubsets(vector<int>& nums, int k) {
	int len = nums.size();
	int sum = accumulate(nums.begin(), nums.end(), 0);
	if (sum % k == 0){
		sum /= k;
	}else{
		return false;
	}
    sort(nums.begin(),nums.end(),greater<int>());
    vector<int> groups(k,sum);
    return canSubsets(nums,0,groups);
}

bool canSubsets(vector<int>& nums,int pos,vector<int>& groups){
    if(pos>=nums.size()){ //所有的group都填满了
    	return true;
    }
    int len=groups.size();
    for(int i=0;i<len;i++){//遍历k个group
        if(groups[i]-nums[pos]>=0){
            groups[i]-=nums[pos];//放pos进桶中
            if(canSubsets(nums,pos+1,groups)){
            	return true;
            } 
            groups[i]+=nums[pos];//pos不该在桶中,拿出
        }
    }
    return false;
}

你可能感兴趣的:(算法)