/* -*- 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 / 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], bnums[MBITS]; ll bss[MBITS]; sl ss0[MAX_M + 1], ss1[MAX_M + 1]; /* subroutines */ void calc(int m, int as[], sl ss[]) { 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]; } for (int bits = 0; bits < mbits; bits++) ss[bnums[bits]].insert(bss[bits]); } /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", as + i); int m = n / 2, mbits = 1 << m; for (int bits = 1, msb = 1; bits < mbits; bits++) { if ((msb << 1) <= bits) msb <<= 1; bnums[bits] = bnums[bits ^ msb] + 1; } calc(m, as, ss0); calc(m, as + m, ss1); ll asum = 0; for (int i = 0; i < n; i++) asum += as[i]; ll ha = asum / 2; ll mind = LINF; for (int i = 0; i <= m; i++) { auto &ss0i = ss0[i], &ss1i = ss1[m - i]; for (auto s0: ss0i) if (s0 <= ha) { auto sit = ss1i.upper_bound(ha - s0); if (sit != ss1i.begin()) { ll t0 = s0 + *(--sit); mind = min(mind, abs(t0 * 2 - asum)); } } } printf("%lld\n", mind); return 0; }