N, A, B, C = list(map(int, input().split()))

l = [int(eval(input())) for _ in range(N)]

l = list(sorted(l))



tar = []

for x in C, B, A:

    if x in l:

        l.remove(x)

    else:

        tar.append(x)



if not tar:

    print((0))

    exit()



ans = float('inf')

for j in range((len(tar) + 1) ** len(l)):

    vvv = [[] for _ in range(len(tar) + 1)]

    for i in sorted(list(range(len(l))), reverse=True):

        idx, j = divmod(j, (len(tar) + 1) ** i)

        vvv[idx].append(l[i])

    if any(len(vvvv) == 0 for vvvv in vvv[:-1]):

        continue

    else:

        bbb = 0

        # print(tar, vvv)

        for k in range(len(tar)):

            bbb += 10 * (len(vvv[k]) - 1)

            bbb += abs(sum(vvv[k]) - tar[k])

        ans = min(ans, bbb)



print(ans)

N, A, B, C = list(map(int, input().split()))

l = [int(eval(input())) for _ in range(N)]

INF = float('inf')





def dfs(cur, a, b, c):

    if cur == N:

        return abs(a - A) + abs(b - B) + abs(c - C) - 30 if min(a, b, c) > 0 else INF

        # A,B,Cに使用する材料を合成し、目的の長さの差を加算（必要なMP）

        # ret1-3で一つ目の材料にも合成魔法のMP10を要求しているので、A,B,Cの初回加算合わせて3回分のMP30を減算

        # a,b,cのいずれかが0のとき、材料が1つも宛がわれていない竹が存在するため、不適（必要MPをINFとして解にならないようにする）

    ret0 = dfs(cur + 1, a, b, c)

    ret1 = dfs(cur + 1, a + l[cur], b, c) + 10

    ret2 = dfs(cur + 1, a, b + l[cur], c) + 10

    ret3 = dfs(cur + 1, a, b, c + l[cur]) + 10

    return min(ret0, ret1, ret2, ret3)

    # l[cur]について、使用しないか、(A,B,C)のいずれかに使用の4分岐





print((dfs(0, 0, 0, 0)))

N, A, B, C = list(map(int, input().split()))
l = [int(eval(input())) for _ in range(N)]
l = list(sorted(l))
tar = []
for x in C, B, A:
    if x in l:
        l.remove(x)
    else:
        tar.append(x)
if not tar:
    print((0))
    exit()
ans = float("inf")
for j in range((len(tar) + 1) ** len(l)):
    vvv = [[] for _ in range(len(tar) + 1)]
    for i in sorted(list(range(len(l))), reverse=True):
        idx, j = divmod(j, (len(tar) + 1) ** i)
        vvv[idx].append(l[i])
    if any(len(vvvv) == 0 for vvvv in vvv[:-1]):
        continue
    else:
        bbb = 0
        # print(tar, vvv)
        for k in range(len(tar)):
            bbb += 10 * (len(vvv[k]) - 1)
            bbb += abs(sum(vvv[k]) - tar[k])
        ans = min(ans, bbb)
print(ans)

N, A, B, C = list(map(int, input().split()))
l = [int(eval(input())) for _ in range(N)]
INF = float("inf")


def dfs(cur, a, b, c):
    if cur == N:
        return abs(a - A) + abs(b - B) + abs(c - C) - 30 if min(a, b, c) > 0 else INF
        # A,B,Cに使用する材料を合成し、目的の長さの差を加算（必要なMP）
        # ret1-3で一つ目の材料にも合成魔法のMP10を要求しているので、A,B,Cの初回加算合わせて3回分のMP30を減算
        # a,b,cのいずれかが0のとき、材料が1つも宛がわれていない竹が存在するため、不適（必要MPをINFとして解にならないようにする）
    ret0 = dfs(cur + 1, a, b, c)
    ret1 = dfs(cur + 1, a + l[cur], b, c) + 10
    ret2 = dfs(cur + 1, a, b + l[cur], c) + 10
    ret3 = dfs(cur + 1, a, b, c + l[cur]) + 10
    return min(ret0, ret1, ret2, ret3)
    # l[cur]について、使用しないか、(A,B,C)のいずれかに使用の4分岐


print((dfs(0, 0, 0, 0)))

-l = list(sorted(l)) -tar = [] -for x in C, B, A: -    if x in l: -        l.remove(x) -    else: -        tar.append(x) -if not tar: -    print((0)) -    exit() -ans = float("inf") -for j in range((len(tar) + 1) ** len(l)): -    vvv = [[] for _ in range(len(tar) + 1)] -    for i in sorted(list(range(len(l))), reverse=True): -        idx, j = divmod(j, (len(tar) + 1) ** i) -        vvv[idx].append(l[i]) -    if any(len(vvvv) == 0 for vvvv in vvv[:-1]): -        continue -    else: -        bbb = 0 -        # print(tar, vvv) -        for k in range(len(tar)): -            bbb += 10 * (len(vvv[k]) - 1) -            bbb += abs(sum(vvv[k]) - tar[k]) -        ans = min(ans, bbb) -print(ans) +INF = float("inf") + + +def dfs(cur, a, b, c): +    if cur == N: +        return abs(a - A) + abs(b - B) + abs(c - C) - 30 if min(a, b, c) > 0 else INF +        # A,B,Cに使用する材料を合成し、目的の長さの差を加算（必要なMP） +        # ret1-3で一つ目の材料にも合成魔法のMP10を要求しているので、A,B,Cの初回加算合わせて3回分のMP30を減算 +        # a,b,cのいずれかが0のとき、材料が1つも宛がわれていない竹が存在するため、不適（必要MPをINFとして解にならないようにする） +    ret0 = dfs(cur + 1, a, b, c) +    ret1 = dfs(cur + 1, a + l[cur], b, c) + 10 +    ret2 = dfs(cur + 1, a, b + l[cur], c) + 10 +    ret3 = dfs(cur + 1, a, b, c + l[cur]) + 10 +    return min(ret0, ret1, ret2, ret3) +    # l[cur]について、使用しないか、(A,B,C)のいずれかに使用の4分岐 + + +print((dfs(0, 0, 0, 0)))