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

namespace AtCorder
{
	public class Program
	{
		static int[] ls;
		static void Main(string[] args)
		{
			var nabc = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
			int n = nabc[0];
			int a = nabc[1];
			int b = nabc[2];
			int c = nabc[3];

			ls = new int[n];
			for (int i = 0; i < n; i++) {
				ls[i] = int.Parse(Console.ReadLine());
			}

			int ans = int.MaxValue;
			var pattern = new int[][]{
					new []{a, b, c },
					new []{a, c, b },
					new []{b, a, c },
					new []{b, c, a },
					new []{c, a, b },
					new []{c, b, a },
				};
			foreach (var p in pattern) {
				int temp = Calc(n, p[0], p[1], p[2]);
				ans = Math.Min(ans, temp);
			}

			Console.WriteLine(ans);
		}

		static int Calc(int n, int k1, int k2, int k3)
		{
			int used = 0;
			int ret1 = CalcCore(n, k1, ref used);
			int ret2 = CalcCore(n, k2, ref used);
			int ret3 = CalcCore(n, k3, ref used);

			return ret1 + ret2 + ret3;
		}

		static int CalcCore(int n, int target, ref int used)
		{
			int max = 1001;
			var dp = new Tuple<int, int>[max];
			for (int i = 0; i < max; i++) {
				dp[i] = new Tuple<int, int>(100000, 0);
			}

			for (int i = 0; i < 1 << n; i++) {
				if ((i & used) != 0) {
					continue;
				}

				int length = 0;
				int count = 0;
				for (int j = 0; j < n; j++) {
					if ((i & (1 << j)) != 0) {
						++count;
						length += ls[j];
					}
				}

				if (length == 0) {
					continue;
				}

				int cost = (count - 1) * 10;

				if (length < max && cost < dp[length].Item1) {
					dp[length] = new Tuple<int, int>(cost, i);
				}
			}

			for (int i = 1; i < max; i++) {
				if (dp[i - 1].Item1 < dp[i].Item1) {
					dp[i] = new Tuple<int, int>(dp[i - 1].Item1 + 1, dp[i - 1].Item2);
				}
			}

			for (int i = max - 2; i >= 0; i--) {
				if (dp[i + 1].Item1 < dp[i].Item1) {
					dp[i] = new Tuple<int, int>(dp[i + 1].Item1 + 1, dp[i + 1].Item2);
				}
			}

			used |= dp[target].Item2;
			return dp[target].Item1;
		}
	}
}
