#include <bits/stdc++.h>
using namespace std;
multiset<int> M;
multiset<int>::iterator it;
int m[3];
int main(void) {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < 3; i++) scanf("%d", m + i);
  sort(m, m + 3);
  int a = m[0], b = m[1], c = m[2];
  for (int i = 0; i < n; i++) {
    int t;
    scanf("%d", &t);
    if (t > a + b + c) {
      puts("-1");
      return 0;
    }
    M.insert(t);
  }
  int ans = 0;
  while (!M.empty()) {
    it = M.lower_bound(b + c + 1);
    if (it == M.end()) break;
    M.erase(it);
    ans++;
  }
  while (!M.empty()) {
    it = M.lower_bound(a + c + 1);
    if (it == M.end()) break;
    M.erase(it);
    ans++;
    if (M.empty()) break;
    it = M.lower_bound(a + 1);
    if (it != M.begin()) M.erase(--it);
  }
  while (!M.empty()) {
    it = M.lower_bound(max(c, a + b) + 1);
    if (it == M.end()) break;
    M.erase(it);
    ans++;
    if (M.empty()) break;
    it = M.lower_bound(b + 1);
    if (it != M.begin()) M.erase(--it);
  }
  int x = 0, y = 0, k = 0;
  for (it = M.begin(); it != M.end(); it++) {
    if (*it <= a + b) x++;
    if (*it <= c) y++;
  }
  int s = max((max(x, y) + 1) / 2, max(x - y, y - x));
  while (!M.empty() && y) {
    it = M.lower_bound(c + 1);
    if (it != M.begin()) {
      --it;
      if (*it <= a + b) x--;
      if (*it <= c) y--;
      M.erase(it);
    }
    it = M.lower_bound(b + 1);
    if (it != M.begin()) {
      --it;
      if (*it <= a + b) x--;
      if (*it <= c) y--;
      M.erase(it);
    }
    it = M.lower_bound(a + 1);
    if (it != M.begin()) {
      --it;
      if (*it <= a + b) x--;
      if (*it <= c) y--;
      M.erase(it);
    }
    s = min(s, ++k + max((max(x, y) + 1) / 2, max(x - y, y - x)));
  }
  printf("%d\n", ans + s);
  return 0;
}
