#include using namespace std; typedef long long ll; void generate_subset_sums(const vector& nums, vector>& subset_sums) { int n = nums.size(); subset_sums.resize(n + 1, vector()); for(int mask = 0; mask < (1 << n); ++mask){ int k = __builtin_popcount(mask); ll sum = 0; for(int i = 0; i < n; ++i){ if(mask & (1 << i)){ sum += nums[i]; } } subset_sums[k].push_back(sum); } } int main(){ ios::sync_with_stdio(false); cin.tie(0); int N; cin >> N; vector R(N); for(int &x : R) cin >> x; int N1 = N / 2; int N2 = N - N1; vector left_nums(R.begin(), R.begin() + N1); vector right_nums(R.begin() + N1, R.end()); vector> left_subsets, right_subsets; generate_subset_sums(left_nums, left_subsets); generate_subset_sums(right_nums, right_subsets); ll min_diff = LLONG_MAX; for(int k = 1; k <= min(N/2, max(N1, N2)); ++k){ if(k > N1 || k > N2) continue; const vector& left_sums = left_subsets[k]; const vector& right_sums = right_subsets[k]; vector sorted_right_sums = right_sums; sort(sorted_right_sums.begin(), sorted_right_sums.end()); for(auto sum1 : left_sums){ auto it = lower_bound(sorted_right_sums.begin(), sorted_right_sums.end(), sum1); if(it != sorted_right_sums.end()){ ll sum2 = *it; min_diff = min(min_diff, abs(sum1 - sum2)); } if(it != sorted_right_sums.begin()){ it--; ll sum2 = *it; min_diff = min(min_diff, abs(sum1 - sum2)); } } } cout << min_diff << "\n"; }