leetcode698-划分k个相等的子集
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
示例 2:
输入: nums = [1,2,3,4], k = 3
输出: false
解题思路
对于本题,我们可以抽象理解一下,相当于是有 k 个一模一样的桶,有nums个球,每个球为nums[i]的大小,问所有球能不能正好装入桶中,桶大小可以调节,但是数目不能变
第一步我们需要将nums个球的总大小求出来,并平均分为k份,确定桶大小
如果平均分成 k 份存在小数,那么肯定会分不均匀,因为我们能用的球,大小只有整数,分不出小数
第二步将球放入桶中,并用递归将所有放入顺序记录下来
第三步,在所有顺序中选择一个可行解即可
其实在上述过程中,我们可以不需要记录所有组合,可以边记录边判断,将当前顺序不可行时,回溯返回上一步
bool backtracking(int* nums,int numsSize,int k,int* tmp,int target,int idx){
if(idx==numsSize)
return true;
for(int i=0;i<k;i++){
if(tmp[i]+nums[idx]>target)continue;
tmp[i]+=nums[idx];
if(backtracking(nums,numsSize,k,tmp,target,idx+1))
return true;
tmp[i]-=nums[idx];
if(tmp[i]==