using System;
using System.Linq;
using System.Collections.Generic;

class Program
{

    static void Main(string[] args)
    {
        var inputs = Console.ReadLine().Split(' ');
        var N = int.Parse(inputs[0]);
        var A = int.Parse(inputs[1]);
        var B = int.Parse(inputs[2]);
        var C = int.Parse(inputs[3]);
        var l = new int[N];
        for (int i = 0; i < l.Length; i++)
        {
            l[i] = int.Parse(Console.ReadLine());
        }

        var result = dfs(0, 0, 0, 0);
        Console.WriteLine(result);

        int dfs(int depth, int a, int b, int c)
        {
            if (depth == N)
            {
                // A,B,Cのいずれかが0以下の場合を除外する
                var ok = a > 0 && b > 0 && c > 0;
                if (!ok)
                {
                    return 1000000000;
                }

                // 最初にA,B,Cに割り当てられた竹は合成ではないので、引いておく
                return Math.Abs(a - A) + Math.Abs(b - B) + Math.Abs(c - C) - 30;
            }

            // 何もしない
            var ret1 = dfs(depth + 1, a, b, c);
            // 合成にかかわらず10MPを使用することとし、最後に調整する
            // Aに使用する
            var ret2 = dfs(depth + 1, a + l[depth], b, c) + 10;
            // Bに使用する
            var ret3 = dfs(depth + 1, a, b + l[depth], c) + 10;
            // Cに使用する
            var ret4 = dfs(depth + 1, a, b, c + l[depth]) + 10;

            // 最小コストを決定する
            var minArrays = new int[] { ret1, ret2, ret3, ret4 };
            int min = int.MaxValue;
            for (int i = 0; i < minArrays.Length; i++)
            {
                min = Math.Min(minArrays[i], min);
            }
            return min;
        }
    }


}

