题目描述 给你一个数组,问你是否能将数组分成 4 等份,即每一份的数字总和都相等,你不能拆分数组中的数字,如果能得到有效划分就返回 true,否则返回 false。 输入输出格式 输入格式 第一行有一个整数 numsSize,表示数组 nums 的大小; 第二行有 numsSize 个整数,表示数组 nums 的所有元素,每个整数用一个空格隔开。使用C++
时间: 2023-12-05 11:06:38 浏览: 92
好的,那么下面是使用 C++ 实现的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
bool canPartition(vector<int>& nums) {
int n = nums.size();
if (n < 4) {
return false;
}
int total = 0;
for (int num : nums) {
total += num;
}
if (total % 4 != 0) {
return false;
}
int target = total / 4;
vector<int> parts(4, 0);
function<bool(int)> backtrack = [&](int i) {
if (i == n) {
return parts[0] == parts[1] && parts[1] == parts[2] && parts[2] == target;
}
for (int j = 0; j < 4; j++) {
if (parts[j] + nums[i] > target) {
continue;
}
parts[j] += nums[i];
if (backtrack(i + 1)) {
return true;
}
parts[j] -= nums[i];
}
return false;
};
sort(nums.rbegin(), nums.rend());
return backtrack(0);
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << (canPartition(nums) ? "true" : "false") << endl;
return 0;
}
```
其中,backtrack 函数使用了 C++11 中的 lambda 表达式,用于进行回溯。i 表示当前处理到原数组的第 i 个元素,j 表示当前需要将元素加到 parts 中的哪个部分。
在回溯过程中,我们首先判断是否已经将原数组的所有元素全部加到 parts 中,并且每个部分的和都为 target,如果满足条件,则返回 true。
接着,我们枚举每个部分,将当前元素加到其中一个部分中,并判断是否满足每个部分的和都不超过 target。如果满足条件,则递归进入下一层,否则进行回溯。
最后,我们将原数组按照从大到小的顺序排序,这样可以让回溯算法更快地找到满足条件的解。
完整代码中还包括了输入和输出的部分。
阅读全文