标签:注意 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); } };
标签:注意 sub 说明 输入 bool 个数 false 输出 pre
原文地址:https://www.cnblogs.com/tianzeng/p/12008344.html