题目
分析
这个题目跟leetcode473 火柴拼正方形的解法一样,这道题也可以叫做火柴拼等边多边形。
解法:
- 第一步判断,所有数的和sum能不能被k整除,不能整除的,必然没有解。
- 将所有的数进行从大到小排序。
- 对每一个数依次遍历每个位置,能放(判断该位置的值是否大于sum / k)就继续遍历下一个数,不能则判断下一个位置能不能放。
代码
class Solution {
private:
bool find;
void dfs(int sum, vector<int>& vec, vector<int>& nums, int k, int target) {
if (find) {
return;
}
if (sum == target * vec.size()) {
find = true;
return;
}
for (int i = 0; !find && i < vec.size(); i++) {
if (vec[i] + nums[k] <= target) {
vec[i] += nums[k];
dfs(sum + nums[k], vec, nums, k + 1, target);
vec[i] -= nums[k];
}
}
return;
}
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum = 0;
for (auto & x : nums) {
sum += x;
}
int target = sum / k;
if (k * target != sum) {
return false;
}
sort(nums.begin(), nums.end(), greater<int>());
find = false;
vector<int> vec(k, 0);
dfs(0, vec, nums, 0, target);
return find;
}
};







网友评论