// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#define int long long

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a = b; return 1; } return 0; }



const int INF = 1e18;



int N, A, B, C;

vector<int> l;



// 「使用する可能性のある竹の集合」と「目標の長さ」を渡すと、目標の長さにするための最小コストを返してくれる

int calc2(vector<int> v, int val) {

  int ret = INF;

  int n = v.size();



  // 竹の集合の使い方を全列挙

  for (int mask = 0; mask < (1LL << n); mask++) {

    int cnt = 0;

    int sum = 0;

    for (int i = 0; i < n; i++) {

      if (mask & (1LL << i)) {

        sum += v[i];

        cnt++;

      }

    }

    if (cnt == 0) continue;

    chmin(ret, (cnt-1)*10 + abs(sum - val));

  }



  return ret;

}



// Aに使う竹、Bに使う竹、Cに使う竹の集合を渡すと、それぞれの目標の高さにするまでの最小コストを返してくれる

int calc(vector<int> a, vector<int> b, vector<int> c) {

  return calc2(a, A) + calc2(b, B) + calc2(c, C);

}



// 「Aに使う可能性のある竹の集合」「Bに使う可能性のある竹の集合」「Bに使う可能性のある竹の集合」を全列挙

int rec(int idx, vector<int> a, vector<int> b, vector<int> c) {

  if (idx >= N) {

    if (a.size() == 0 || b.size() == 0 || c.size() == 0) return INF;

    return calc(a, b, c);

  }



  int ret = INF;



  // idx番目の竹ををAに使う

  a.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  a.pop_back();



  // idx番目の竹ををBに使う

  b.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  b.pop_back();



  // idx番目の竹ををCに使う

  c.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  c.pop_back();



  return ret;

}



signed main() {

  cin >> N >> A >> B >> C;

  l.resize(N);

  for (int i = 0; i < N; i++) {

    cin >> l[i];

  }



  vector<int> a;

  vector<int> b;

  vector<int> c;

  int ans = rec(0, a, b, c);



  cout << ans << endl;



  return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.1127349517643825x):
#include <bits/stdc++.h>

using namespace std;



#define int long long

#define all(v) (v).begin(), (v).end()

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a = b; return 1; } return 0; }



const int INF = 1e18;



int N, A, B, C;

vector<int> l;



// Aに使う竹の集合、Bに使う竹の集合、Cに使う竹の集合を渡すと、作りたい竹にするのにかかるコストを返してくれる

int calc(vector<int> &a, vector<int> &b, vector<int> &c) {

  int aRes = abs(accumulate(all(a), 0LL) - A) + ((a.size()-1) * 10);

  int bRes = abs(accumulate(all(b), 0LL) - B) + ((b.size()-1) * 10);

  int cRes = abs(accumulate(all(c), 0LL) - C) + ((c.size()-1) * 10);



  return aRes + bRes + cRes;

}



int rec(int idx, vector<int> &a, vector<int> &b, vector<int> &c) {

  if (idx >=  N) {

    if (a.size() == 0 or b.size() == 0 or c.size() == 0) return INF;

    return calc(a, b, c);

  }



  int ret = INF;



  // idx番目の竹をAに使う

  a.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  a.pop_back();



  // idx番目の竹をBに使う

  b.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  b.pop_back();



  // idx番目の竹をCに使う

  c.push_back(l[idx]);

  chmin(ret, rec(idx+1, a, b, c));

  c.pop_back();



  // idx番目の竹を使わない

  chmin(ret, rec(idx+1, a, b, c));



  return ret;

}



signed main() {

  cin >> N >> A >> B >> C;

  l.resize(N);

  for (int i = 0; i < N; i++) {

    cin >> l[i];

  }



  vector<int> a;

  vector<int> b;

  vector<int> c;

  cout << rec(0, a, b, c) << endl;



  return 0;

}