#include <bits/stdc++.h>
using namespace std;
int chh;
const int N = 200005;
int n, e;
int a[3], b[3];
multiset<int> s;
multiset<int>::iterator it, l, r;
int main() {
  int ans, flag, x, sum, d, y;
  while (~scanf("%d", &n)) {
    e = ans = 0, flag = 1, s.clear();
    for (int i = 0; i < (3); i++) scanf("%d", &a[i]);
    b[0] = a[0] + a[1], b[1] = a[0] + a[2], b[2] = a[1] + a[2];
    sort(a, a + 3);
    sort(b, b + 3);
    sum = a[0] + a[1] + a[2];
    for (int i = 0; i < (n); i++) {
      scanf("%d", &x);
      if (x > sum)
        flag = 0;
      else if (x > b[2])
        ans++;
      else
        s.insert(x);
    }
    if (!flag) {
      puts("-1");
      continue;
    }
    while (!s.empty()) {
      it = s.end(), it--, x = *it;
      ans++, s.erase(it);
      if (s.empty()) break;
      if (x > a[2]) {
        d = b[lower_bound(b, b + 3, x) - b];
        for (int i = 0; i < (3); i++)
          if (a[i] + d == sum) {
            y = a[i];
            break;
          }
        it = s.upper_bound(y);
        if (it != s.begin()) it--, s.erase(it);
      } else {
        d = a[lower_bound(a, a + 3, x) - a];
        if (d == a[0])
          x = a[1], y = a[2];
        else if (d == a[1])
          x = a[0], y = a[2];
        else if (d == a[2])
          x = a[0], y = a[1];
        l = s.upper_bound(x);
        r = s.upper_bound(y);
        if (l != s.begin() && r != s.begin() && (s).size() >= 2) {
          if (l == r) l--;
          if (l == s.begin()) {
            l = s.upper_bound(x + y);
            if (l != s.begin()) l--, s.erase(l);
          } else {
            l--, r--;
            s.erase(l), s.erase(r);
          }
        } else {
          l = s.upper_bound(x + y);
          if (l != s.begin()) l--, s.erase(l);
        }
      }
    }
    printf("%d\n", ans);
  }
  return 0;
}
