Submission
Status:
---P--P---
Subtask/Task Score:
20/100
Score: 20
User: ZanTy
Problemset: ประลอง
Language: cpp
Time: 0.004 second
Submitted On: 2026-10-07 12:57:56
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <climits>
using namespace std;
int n;
int arr[105];
long long total_sum = 0;
int target_count;
long long min_diff = LLONG_MAX;
int best_mask = 0;
// ฟังก์ชัน Backtracking พร้อมเช็คเงื่อนไข
void solve(int index, int count1, long long sum1, int current_mask) {
// ถ้าเลือกครบตามจำนวนที่ต้องการ
if (count1 == target_count) {
long long sum2 = total_sum - sum1;
long long diff = abs(sum1 - sum2);
if (diff < min_diff) {
min_diff = diff;
best_mask = current_mask;
}
return;
}
// Pruning: ถ้าเลือกจนหมดแล้วแต่ยังไม่ครบจำนวน หรือตัวที่เหลือไม่พอให้เลือก
if (index >= n || (count1 + (n - index)) < target_count) {
return;
}
// ทางเลือกที่ 1: เลือกตัวปัจจุบันเข้าฝ่ายที่ 1
solve(index + 1, count1 + 1, sum1 + arr[index], current_mask | (1 << index));
// ทางเลือกที่ 2: ไม่เลือกตัวปัจจุบัน (ให้ไปอยู่ฝ่ายที่ 2)
solve(index + 1, count1, sum1, current_mask);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
if (!(cin >> n)) return 0;
for (int i = 0; i < n; i++) {
cin >> arr[i];
total_sum += arr[i];
}
target_count = n / 2; //[cite: 1]
solve(0, 0, 0, 0);
// แสดงผลสมาชิกฝ่ายที่ 1[cite: 1]
for (int i = 0; i < n; i++) {
if ((best_mask & (1 << i)) != 0) {
cout << arr[i] << " ";
}
}
cout << "\n";
// แสดงผลสมาชิกฝ่ายที่ 2[cite: 1]
for (int i = 0; i < n; i++) {
if ((best_mask & (1 << i)) == 0) {
cout << arr[i] << " ";
}
}
cout << "\n";
return 0;
}