Submission
Status:
----------
Subtask/Task Score:
0/100
Score: 0
User: mik
Problemset: ประลอง
Language: cpp
Time: 0.004 second
Submitted On: 2026-10-11 17:01:52
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <set>
using namespace std;
int n;
vector<int> arr;
int total_sum = 0;
int best_diff = INT_MAX;
vector<int> best_comb;
set<tuple<int, int, int>> memo;
void backtrack(int idx, int count, int current_sum, int target_k, vector<int>& current_comb) {
if (count == target_k) {
int diff = abs(total_sum - 2 * current_sum);
if (diff < best_diff) {
best_diff = diff;
best_comb = current_comb;
}
return;
}
if (idx == n) return;
if (count + (n - idx) < target_k) return;
tuple<int, int, int> state = {idx, count, current_sum};
if (memo.count(state)) return;
current_comb.push_back(arr[idx]);
backtrack(idx + 1, count + 1, current_sum + arr[idx], target_k, current_comb);
current_comb.pop_back();
backtrack(idx + 1, count, current_sum, target_k, current_comb);
memo.insert(state);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
if (!(cin >> n)) return 0;
arr.resize(n);
total_sum = 0;
for (int i = 0; i < n; ++i) {
cin >> arr[i];
total_sum += arr[i];
}
vector<int> targets;
if (n % 2 == 0) {
targets = {n / 2};
} else {
targets = {n / 2, n / 2 + 1};
}
for (int target_k : targets) {
memo.clear();
vector<int> current_comb;
backtrack(0, 0, 0, target_k, current_comb);
}
for (int i = 0; i < (int)best_comb.size(); ++i) {
cout << best_comb[i] << (i == (int)best_comb.size() - 1 ? "" : " ");
}
cout << "\n";
return 0;
}