// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;



typedef long long ll;

typedef pair<int,int> P;

typedef map<int,int> M;

typedef vector<int> V;

typedef queue<int> Q;

typedef pair<long,long> PLL;

typedef map<long,long> MLL;

typedef vector<long> VLL;

#define INF (int)(1e9)

#define MAXX 1.1529215e+18

#define inf 999999

#define EPS (1e-7)

#define MOD (1e9+7)

#define rep(i,n) for(int i=0; i<(int)(n);i++)

#define REP(i,n) for(int i=1;i<=(int)(n);i++)

#define rrep(i,n) for(int i=(int)(n-1);i>=0;i--)

#define FOR(i,k,n) for(int i=(k);i<(int)(n);i++)

#define ALL(a)  a.begin(),a.end()

#define RALL(a) a.begin(),a.end(),greater<int>()

#define ROT(a) a.begin(),a.begin()+1,a.end()

#define RROT(a) a.begin(),a.end()-1,a.end()

#define PB push_back

#define MP make_pair

#define PI acos(-1.0)

/*--------------------------------------------*/

/*--------------------------------------------*/

int n;

V take(3+1);

V l(8+1);//l[i]の竹をAで使うか，Bで使うか，Cで使うか，使わないかの全探索

//その都度合成していき最後に伸ばしたり縮めたりして調整

//4^8=66536通り

int ans=INF;

int tmp;

int dfs(int depth,V use){

    if(depth==n){//0~n-1までの竹,A,B,C,Xのどれに使うかがuseに格納されている

        V flag(4,0);

        rep(i,n){

            REP(j,3){

                if(use[i]==j)flag[j]=1;

            }

        }REP(j,3){

            if(flag[j]==0)return INF;//A,B,Cに一本も使われていないことはない

        }    

        V length(3,0);//0index

        rep(i,n){

            REP(j,3){//a...j=1

                if(use[i]==j)length[j-1]+=l[i];//i番目の竹をjとして利用,0indexに注

            }

        }

        tmp=0;

        rep(i,3){

            tmp+=abs(take[i]-length[i]);//延長，短縮

        }

        return tmp;

    }

    use[depth]=0;

    //not use

    int res=dfs(depth+1,use);

    //use

    REP(i,3){

        use[depth]=i;

        res=min(dfs(depth+1,use)+10,res);

    }

    return res;

}

int main(){

    cin>>n;rep(i,3){cin>>take[i];}

    rep(i,n){cin>>l[i];}

    V use(9);

    cout<<dfs(0,use)-30<<endl;//無邪気に使用する竹全てに合成魔法使っているので,30引け

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;



typedef long long ll;

typedef pair<int,int> P;

typedef map<int,int> M;

typedef vector<int> V;

typedef queue<int> Q;

typedef pair<long,long> PLL;

typedef map<long,long> MLL;

typedef vector<long> VLL;

#define INF (int)(1e9)

#define MAXX 1.1529215e+18

#define inf 999999

#define EPS (1e-7)

#define MOD (1e9+7)

#define rep(i,n) for(int i=0; i<(int)(n);i++)

#define REP(i,n) for(int i=1;i<=(int)(n);i++)

#define rrep(i,n) for(int i=(int)(n-1);i>=0;i--)

#define FOR(i,k,n) for(int i=(k);i<(int)(n);i++)

#define ALL(a)  a.begin(),a.end()

#define RALL(a) a.begin(),a.end(),greater<int>()

#define ROT(a) a.begin(),a.begin()+1,a.end()

#define RROT(a) a.begin(),a.end()-1,a.end()

#define PB push_back

#define MP make_pair

#define PI acos(-1.0)

/*--------------------------------------------*/

/*--------------------------------------------*/

int n;

V take(3+1);

V l(8+1);//l[i]の竹をAで使うか，Bで使うか，Cで使うか，使わないかの全探索

//その都度合成していき,最後に伸ばしたり縮めたりして調整

//4^8=66536通り

int tmp;

int dfs(int depth,int a,int b,int c){

    if(depth==n){

        if(!a||!b||!c)return INF;//A,B,Cを構成する竹がないことはない

        return abs(take[0]-a)+abs(take[1]-b)+abs(take[2]-c);

    }

    //not use

    int res=dfs(depth+1,a,b,c);

    //use

    res=min(res,dfs(depth+1,a+l[depth],b,c)+(a==0?0:10));//depth番目の竹をaとして使う

    res=min(res,dfs(depth+1,a,b+l[depth],c)+(b==0?0:10));//最初の竹は合成ではない

    res=min(res,dfs(depth+1,a,b,c+l[depth])+(c==0?0:10));

    return res;

}

int main(){

    cin>>n;rep(i,3){cin>>take[i];}

    rep(i,n){cin>>l[i];}

    cout<<dfs(0,0,0,0)<<endl;//無邪気に使用する竹全てに合成魔法使っているので,30引け

}


// Fastest known solution for this problem: