码迷,mamicode.com
首页 > 其他好文 > 详细

划分为k个相等的子集

时间:2019-12-08 22:39:15      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:注意   sub   说明   输入   bool   个数   false   输出   pre   

给定一个整数数组  nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

示例 1:

输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
 

注意:

1 <= k <= len(nums) <= 16
0 < nums[i] < 10000

class Solution {
private:
    bool canPartitionKSubsetsCore(vector<int>& nums,vector<int>& tmp,int cur,int k)//形参引用节省内存
    {
        if(cur<0)
            return true;

        for(int i=0;i<k;++i)
        {
            if(tmp[i]==nums[cur]||(cur>0&&tmp[i]-nums[cur]>=nums[0]))//3.枝剪
            {
                tmp[i]-=nums[cur];
                if(canPartitionKSubsetsCore(nums,tmp,cur-1,k))
                    return true;
                tmp[i]+=nums[cur];
            }
        }
        return false;
    }
public:
    bool canPartitionKSubsets(vector<int>& nums, int k) {
        if(nums.empty()||k<0||k>nums.size())
            return false;

        int sum=accumulate(nums.begin(),nums.end(),0);
        int average=sum/k;
        if(average*k!=sum)//1.
            return false;
        
        sort(nums.begin(),nums.end());
        if(nums[nums.size()-1]>average)//2.
            return false;
        
        vector<int> tmp(k,average);
        return canPartitionKSubsetsCore(nums,tmp,nums.size()-1,k);
    }
};

 

划分为k个相等的子集

标签:注意   sub   说明   输入   bool   个数   false   输出   pre   

原文地址:https://www.cnblogs.com/tianzeng/p/12008344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!