给定一个整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
int target=0;
int maxNum=nums[0];
for(auto it:nums){
if(it>maxNum)
maxNum=it;
target+=it;
}
if(target%k!=0||k>nums.size()||maxNum>target/k)
return false;
target=target/k;
vector<bool> used(nums.size(),false);
return backtrack(nums,k,target,0,0,used);
}
bool backtrack(vector<int> &nums,int k,int &target,int subsum,int start,vector<bool> &used){
if(k==0){
//cout<<"successful!"<<endl;
return true;
}
if(subsum==target){
return backtrack(nums,k-1,target,0,0,used);
//cout<<k-1<<endl;
}
for(int i=start;i<nums.size();i++){
if(!used[i]&&subsum+nums[i]<=target){
used[i]=true;
if(backtrack(nums,k,target,subsum+nums[i],i+1,used)) //刚开始,忘记return
return true;
used[i]=false;
}
}
return false;
}
};