三个数组各能否分两半

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

「划分问题」:能不能把一个数组分成两堆,两堆的和相等?三个数组各判一次。注意 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 编译。)

提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论