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) {
int totalSum = 0;
for (auto num : nums)
{
totalSum += num;
}
if(totalSum % k != 0)
{
return false;
}
std::sort(nums.begin(), nums.end());
vector<int> vec(k, 0);
return partition(nums, totalSum/k, vec, nums.size()-1);
}
bool partition(vector<int>& nums, int target, vector<int> & vec, int index)
{
if(index < 0)
{
for(auto v:vec)
{
if(v != target)
return false;
}
return true;
}
int num = nums[index];
for(int cursor = 0; cursor < vec.size(); cursor++)
{
if(vec[cursor]+num > target)
continue;
vec[cursor] += num;
if(partition(nums, target, vec, index-1))
return true;
vec[cursor] -= nums[index];
}
return false;
}
};