/* -*- coding: utf-8 -*- * * 3697.cc: No.3697 螳溷鴨繧呈純縺医k - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 40; const int MAX_M = (MAX_N + 1) / 2; const int MBITS = 1 << MAX_M; const long long LINF = 1LL << 60; /* typedef */ using ll = long long; using sl = set; /* global variables */ int as[MAX_N]; ll bss[MBITS]; /* subroutines */ sl calc(int m, int as[]) { int mbits = 1 << m; bss[0] = 0; for (int bits = 1, msb = 1, msi = 0; bits < mbits; bits++) { if ((msb << 1) <= bits) msb <<= 1, msi++; bss[bits] = bss[bits ^ msb] + as[msi]; } return sl(bss, bss + mbits); } /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", as + i); int m0 = n / 2, m1 = n - m0; auto ss0 = calc(m0, as); auto ss1 = calc(m1, as + m0); ll asum = 0; for (int i = 0; i < n; i++) asum += as[i]; ll ha = asum / 2; ll mind = LINF; for (auto s0: ss0) if (s0 <= ha) { auto sit = ss1.upper_bound(ha - s0); if (sit != ss1.begin()) { ll t0 = s0 + *(--sit); mind = min(mind, abs(t0 * 2 - asum)); } } printf("%lld\n", mind); return 0; }