func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long read() {     long long sum = 0, f = 1;     char ch = getchar();     while (ch !=  -  && (ch <  0  || ch >  9 )) ch = getchar();     if (ch ==  - ) ch = getchar(), f = -1;     while (ch <=  9  && ch >=  0 ) sum = sum * 10 + ch -  0 , ch = getchar();     return sum * f;   }   int n;   long long w[22];   bool used[(1 << 20) + 10];   int st[22], num, end_, maxn;   bool col[22];   long long A[(1 << 20) + 10], B[(1 << 20) + 10], cntA, cntB;   long long AA, BB, AA_, BB_;   void dfs(int a, long long cha, int ty, int allodd, int alleven) {     if (a == end_) {       if (!ty)         A[++cntA] = cha;       else         B[++cntB] = cha;       if (!ty) {         if (allodd) AA = cha;         if (alleven) AA_ = cha;       } else {         if (allodd) BB = cha;         if (alleven) BB_ = cha;       }       return;     }     col[a] = 0, dfs(a + 1, cha - w[st[a]], ty, 0, alleven);     col[a] = 1, dfs(a + 1, cha + w[st[a]], ty, allodd, 0);   }   bool chk(int sta) {     num = 0;     long long sum = 0;     for (int i = 1; i <= n; i++)       if (sta & (1 << (i - 1))) st[++num] = i, sum += w[i];     if (num == 1 || (sum & 1) != ((num - 1) & 1)) return 0;     int mid = num >> 1;     cntA = cntB = 0;     AA = AA_ = BB = BB_ = 2e18;     end_ = mid + 1, dfs(1, 0, 0, 1, 1);     end_ = num + 1, dfs(mid + 1, 0, 1, 1, 1);     sort(A + 1, A + 1 + cntA);     sort(B + 1, B + 1 + cntB);     int pB = cntB, pA = cntA;     if (abs(AA + BB_) <= num - 1 || abs(AA_ + BB) <= num - 1) return 1;     for (int i = 1; i <= cntA; i++) {       if (A[i] == AA_ || A[i] == AA) continue;       long long l = 1 - num - A[i], r = num - 1 - A[i];       while (pB && B[pB] > r) pB--;       if (!pB) return 0;       if (B[pB] >= l) return 1;     }     for (int i = 1; i <= cntB; i++) {       if (B[i] == BB_ || B[i] == BB) continue;       long long l = 1 - num - B[i], r = num - 1 - B[i];       while (pA && A[pA] > r) pA--;       if (!pA) return 0;       if (A[pA] >= l) return 1;     }     return 0;   }   int f[(1 << 20) + 10 + 10];   int s[22];   int main() {     n = read();     int q = 0;     for (int i = 1; i <= n; i++) {       w[i] = read();       if (w[i]) w[++q] = w[i];     }     n = q;     maxn = (1 << n) - 1;     for (int i = 1; i <= maxn; i++) {       used[i] = chk(i);       if (used[i]) f[i] = 1;     }     for (int i = 1; i <= maxn; i++)       if (used[i]) {         int g = maxn ^ i;         for (int j = g; j; j = (j - 1) & g) {           f[i + j] = max(f[i + j], f[j] + f[i]);         }       }     cout << n - f[maxn];     return 0;   }   