#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
deque<int> deq;
const long double EPS = 0.000000001;
const long long INF64 = 1000000000000000000;
const int INF32 = 2000000000;
bool iss_pt_in_triangle(pair<int, int> a, pair<int, int> b, pair<int, int> c,
                        pair<int, int> point) {
  int x1 = a.first, x2 = b.first, x3 = c.first, x0 = point.first;
  int y1 = a.second, y2 = b.second, y3 = c.second, y0 = point.second;
  int aa = (x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0);
  int bb = (x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0);
  int cc = (x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0);
  if (aa == 0 || bb == 0 || cc == 0) return 1;
  if (aa >= 0 && bb >= 0 && cc >= 0) return 1;
  if (aa <= 0 && bb <= 0 && cc <= 0) return 1;
  return 0;
}
bool iss_ll(long long &__1, long long &__2) { return INF64 / __1 >= __2; }
bool equal(long double _1, long double _2) { return (abs(_1 - _2) < EPS); }
bool iss_sqr(int __1) {
  long long __2 = sqrt((long double)__1);
  return __2 * __2 == __1;
};
bool iss_prime(long long __1) {
  for (int i = 2; i * i <= __1; ++i)
    if (!(__1 % i)) return 0;
  return 1;
}
int gcd(int __1, int __2) {
  while (__1 && __2)
    if (__1 > __2)
      __1 = __1 % __2;
    else
      __2 = __2 % __1;
  return __1 + __2;
}
int lcm(int &__1, int &__2) { return __1 * __2 / (gcd(__1, __2)); }
int sq_cube(long long x) {
  if (x == 0) return 1;
  int l = 0, r = 2e6;
  while (l + 1 < r) {
    int m = (l + r) / 2;
    if (m * m * m > x)
      r = m;
    else
      l = m;
  }
  return l;
}
map<int, int> MAP;
const int modd = 65610001;
long long fac[1000], rfac[1000];
int cnt[10900][111];
int dop[10900][111];
long long poww(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b % 2) res *= a;
    res %= modd;
    a *= a;
    a %= modd;
    b /= 2;
  }
  return res;
}
long long C(int n, int k) {
  return (((fac[n] * rfac[k]) % modd) * rfac[n - k]) % modd;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  fac[0] = 1;
  for (int i = 1; i < 1000; ++i) {
    fac[i] = i * fac[i - 1];
    fac[i] %= modd;
  }
  for (int i = 0; i < 1000; ++i) {
    rfac[i] = poww(fac[i], modd - 2);
  }
  int n;
  cin >> n;
  cnt[0][0] = 1;
  for (int i = 1; i <= n; ++i) {
    int x;
    cin >> x;
    memset(dop, 0, sizeof(dop));
    for (int sum = x; sum <= 10000; ++sum) {
      for (int j = 1; j <= i; ++j) {
        dop[sum][j] += cnt[sum - x][j - 1];
      }
    }
    for (int j = 0; j <= 10000; ++j)
      for (int q = 1; q <= i; ++q) {
        cnt[j][q] += dop[j][q];
        cnt[j][q] %= modd;
      }
    MAP[x]++;
  }
  int res = 1;
  for (auto i : MAP) {
    int sum = i.first;
    for (int j = 1; j <= i.second; ++j) {
      if (cnt[sum][j] == C(i.second, j)) res = max(res, j);
      if (cnt[sum][j] == C(i.second, j) && j == i.second && MAP.size() == 2) {
        res = n;
      }
      sum += i.first;
    }
  }
  cout << res << "\n";
  return 0;
}
