leetcode698-划分k个相等的子集、华为OD机试C卷(200分)-项目排期

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]==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会起名字呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值