题目描述:
Given an array of integers nums and a positive integer k, find whether it's possible to divide this array into k non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
Output: True
Explanation: It's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
• 1 <= k <= len(nums) <= 16.
• 0 < nums[i] < 10000.
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
bool result=false;
int sum=0;
for(int num:nums) sum+=num;
if(sum%k!=0) return false;
unordered_set<int> visited; //visited保存已经遍历过的元素的下标
helper(nums,visited,sum/k,k,0,0,result);
return result;
}
void helper(vector<int>& nums, unordered_set<int> visited, int target, int k, int cur_sum, int start, bool& result)
{
if(result==true) return;
if(k==1)
{
result=true;
return;
}
else if(cur_sum==target) helper(nums,visited,target,k-1,0,0,result);
else if(cur_sum>target) return;
else
{ //start参数很重要,令start从0开始,假设上一次递归遍历的是nums[i],那么i之前的数字也遍历过,下一次只需要从i+1开始即可
for(int i=start;i<nums.size();i++)
{
if(visited.count(i)) continue;
visited.insert(i);
helper(nums,visited,target,k,cur_sum+nums[i],i+1,result);
visited.erase(i);
}
}
}
};