问题描述:判断数组中的数是否可以分为和相等的k组数
Example:
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.
第一个思路是先找到分为K组数之后,每组的和sum/k;之后通过递归,dfs实现
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum = 0;
int len = nums.size();
for(int i = 0; i < len ; i++)
sum += nums[i];
if(sum % k != 0)
return false;
int det = sum / k;
vector<int> visited(len,0);
return canPartition(nums,visited,0,0,k,det);
}
bool canPartition(vector<int>& nums, vector<int>& visited, int start, int cur_sum, int k, int target)
{
if(k == 1) //由于已经确定了nums可以分为大小相同的k组数,最后一组无需判断
return true;
if(cur_sum == target )
return canPartition(nums,visited,0,0,k-1,target);
for(int i = start; i < nums.size(); i++)
{
if(nums[i] + cur_sum > target) //这是一个很棒的剪枝
continue;
if(!visited[i])
{
visited[i] = 1;
if(canPartition(nums,visited,i+1,cur_sum + nums[i],k,target))
return true;
visited[i] = 0; //回溯
}
}
return false;
}
};
dp实现之后补上 还不太会