#include <iostream>
#include <vector>
#include <iterator>
#include <cmath>
#include <algorithm>

int N, A, B, C;
std::vector<int> l;

int dfs(int n, int a, int b, int c){//引数::探索の深さ、竹Aの長さ、竹Bの長さ、竹Cの長さ。
  if(n == N)}	//最深部における処理
    if(std::min( {a, b, c} ) > 0){//A,B,Cを作るのに少なくとも一つの竹を使う必要がある。
      return std::fabs(a - A) + std::fabs(b - B) + std::fabs(c - C) - 30;
      //30引くのは最初に竹を選ぶという行為にMPを消費しないため。a-Aなどは延長/短縮に使うMP。
    }else{
      return 100000;
    }
  }

  int mp1 = dfs(n + 1, a, b, c);			//深さkに対してk番目の竹を選ばない。
  int mp2 = dfs(n + 1, a + l[n], b, c) + 10;//竹Aを作るのにk番目の竹を使う。
  int mp3 = dfs(n + 1, a, b + l[n] ,c) + 10;//竹Bを作るのにk番目の竹を使う。
  int mp4 = dfs(n + 1, a, b, c + l[n]) + 10;//竹Cを作るのにk番目の竹を使う。
  return std::min( {mp1, mp2, mp3, mp4} );	//深さ0での比較
}

int main(){
  std::cin >> N >> A >> B >> C;
  std::copy_n(std::istream_iterator<int>(std::cin), N, std::back_inserter(l));
  std::cout << dfs(0, 0, 0, 0) << std::endl;
  return 0;
}
