#include <bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 20) + 5;
char buf[1 << 12], *pp1 = buf, *pp2 = buf, nc;
int ny;
inline char gc() {
  return pp1 == pp2 &&
                 (pp2 = (pp1 = buf) + fread(buf, 1, 1 << 12, stdin), pp1 == pp2)
             ? EOF
             : *pp1++;
}
inline long long read() {
  long long x = 0;
  for (ny = 1; nc = gc(), (nc < 48 || nc > 57) && nc != EOF;)
    if (nc == 45) ny = -1;
  if (nc < 0) return nc;
  for (x = nc - 48; nc = gc(), 47 < nc && nc < 58 && nc != EOF;
       x = (x << 3) + (x << 1) + (nc ^ 48))
    ;
  return x * ny;
}
int n, S, sz[MAXN], vis[MAXN], ans[MAXN];
long long a[MAXN], Sum[MAXN];
int main() {
  n = read();
  for (int i = 0; i <= n - 1; i++) a[i] = read(), (!a[i] ? n--, i-- : 0);
  S = (1 << n) - 1;
  for (int i = 0; i <= S; i++)
    for (int j = 0; j <= n - 1; j++)
      if (i >> j & 1) Sum[i] += a[j];
  for (int s = 0; s <= S; s++) {
    sz[s] = sz[s >> 1] + (s & 1);
    for (int t = (s - 1) & s; ((t << 1) >= s) && t; t = (t - 1) & s)
      if (abs(Sum[t] - Sum[s ^ t]) < sz[s] &&
          ((sz[s] - abs(Sum[t] - Sum[s ^ t])) & 1)) {
        vis[s] = 1;
        break;
      }
  }
  int Mx = 0;
  for (int s = 1; s <= S; s++)
    if (vis[s]) {
      ans[s] = max(ans[s], 1);
      int t = S ^ s;
      for (int i = t; i; i = (i - 1) & t)
        ans[i | s] = max(ans[i | s], ans[i] + ans[s]);
    }
  for (int s = 1; s <= S; s++) Mx = max(Mx, ans[s]);
  cout << n - Mx;
  return 0;
}
