三个数组各能否分两半
「划分问题」:能不能把一个数组分成两堆,两堆的和相等?三个数组各判一次。注意 can_split 一行新算法都没写,只是把输入交给了 subset_sum:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#include <numeric>
bool subset_sum(const vector<int>& arr, int target) { // 老朋友:能不能挑出子集,和正好是 target
if (target < 0) return false;
vector<bool> reach(target + 1, false);
reach[0] = true;
for (int x : arr) {
for (int r = target; r >= x; r--) {
if (reach[r - x]) reach[r] = true;
}
}
return reach[target];
}
const vector<int> NO = {17, 24, 15, 13, 23};
const vector<int> YES = {10, 20, 15, 5};
const vector<int> ODD = {17, 24, 15, 13, 23, 3};
bool can_split(const vector<int>& arr) {
int s = accumulate(arr.begin(), arr.end(), 0);
if (s % 2 == 1) return false;
return subset_sum(arr, s / 2);
}
int main() {
vector<vector<int>> all = {NO, YES, ODD};
for (size_t k = 0; k < all.size(); k++) cout << (k ? "/" : "") << (can_split(all[k]) ? "能" : "不能");
cout << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)
全部评论