Submission

Status:

----------

Subtask/Task Score:

0/100

Score: 0

User: nga12345

Problemset: ประลอง

Language: cpp

Time: 0.003 second

Submitted On: 2025-10-11 13:49:40

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <utility> 

using namespace std;

pair<vector<int>, vector<int>> findClosestSumPartitionArrays(const vector<int>& arr) {
    int total_sum = accumulate(arr.begin(), arr.end(), 0);
    int n = arr.size();
    if (n == 0) return {{}, {}};

    int target = total_sum / 2;

    vector<vector<bool>> dp(n + 1, vector<bool>(target + 1, false));
    
    for (int i = 0; i <= n; ++i) {
        dp[i][0] = true;
    }

    for (int i = 1; i <= n; ++i) {
        int current_num = arr[i - 1]; 
        for (int j = 1; j <= target; ++j) {
            dp[i][j] = dp[i - 1][j];

            if (j >= current_num) {
                dp[i][j] = dp[i][j] || dp[i - 1][j - current_num];
            }
        }
    }

    int sum1 = 0;
    for (int j = target; j >= 0; --j) {
        if (dp[n][j]) {
            sum1 = j;
            break;
        }
    }

    vector<int> subset1;
    vector<int> subset2;
    int current_sum = sum1;
    vector<bool> in_subset1(n, false);
    
    for (int i = n; i >= 1; --i) {
        int num = arr[i - 1];
        
        if (dp[i - 1][current_sum]) {
            
        } else {
            subset1.push_back(num);
            current_sum -= num;
            in_subset1[i - 1] = true;
        }
    }

    for (int i = 0; i < n; ++i) {
        if (!in_subset1[i]) {
            subset2.push_back(arr[i]);
        }
    }
    
    reverse(subset1.begin(), subset1.end());
    sort(subset1.begin(), subset1.end());
    sort(subset2.begin(), subset2.end());

    return {subset1, subset2};
}

int main() {
    vector<int> a = {10, 4, 6, 3, 7, 9, 2};
    pair<vector<int>, vector<int>> result_a = findClosestSumPartitionArrays(a);

    for (size_t i = 0; i < result_a.first.size(); ++i) {
        cout << result_a.first[i] << " ";
    }

    cout << '\n';
    for (size_t i = 0; i < result_a.second.size(); ++i) {
        cout << result_a.second[i] << " ";
    }

    return 0;
}