import bisect

import heapq

import itertools

import math

import os

import re

import string

import sys

from collections import Counter, deque, defaultdict

from decimal import Decimal

from fractions import gcd

from functools import lru_cache, reduce

from operator import itemgetter



import numpy as np



if os.getenv("LOCAL"):

    sys.stdin = open("_in.txt", "r")



sys.setrecursionlimit(2147483647)

INF = float("inf")

IINF = 10 ** 18

MOD = 10 ** 9 + 7



D, G = list(map(int, sys.stdin.readline().split()))

P, C = list(zip(*[list(map(int, sys.stdin.readline().split())) for _ in range(D)]))



P = np.array(P, dtype=int)

C = np.array(C, dtype=int)

A = np.arange(1, D + 1, dtype=int) * 100  # 1問のスコア

comp_scores = P * A + C



ans = P.sum()

for i in range(D):

    # i: 途中まで解く

    # comp: True ならその問題は全部解く

    for comp in itertools.product([True, False], repeat=D):

        comp = np.array(comp)

        comp[i] = False

        cnt = P[comp].sum()

        score = comp_scores[comp].sum()

        add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i])))

        add_score = A[i] * add_cnt

        if score + add_score >= G:

            ans = min(ans, cnt + add_cnt)

print(ans)

import itertools

import os

import sys



import numpy as np



if os.getenv("LOCAL"):

    sys.stdin = open("_in.txt", "r")



sys.setrecursionlimit(2147483647)

INF = float("inf")

IINF = 10 ** 18

MOD = 10 ** 9 + 7



D, G = list(map(int, sys.stdin.readline().split()))

P, C = list(zip(*[list(map(int, sys.stdin.readline().split())) for _ in range(D)]))



P = np.array(P, dtype=int)

C = np.array(C, dtype=int)

A = np.arange(1, D + 1, dtype=int) * 100  # 1問のスコア

comp_scores = P * A + C



# ans = P.sum()

# for i in range(D):

#     # i: 途中まで解く

#     # comp: True ならその問題は全部解く

#     for comp in itertools.product([True, False], repeat=D):

#         comp = np.array(comp)

#         comp[i] = False

#         cnt = P[comp].sum()

#         score = comp_scores[comp].sum()

#         add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i])))

#         add_score = A[i] * add_cnt

#         if score + add_score >= G:

#             ans = min(ans, cnt + add_cnt)

# print(ans)





ans = P.sum()

for i in range(D):

    # i: 途中まで解く

    # True なら全部解く、False なら 1 問も説かない

    patterns = np.array(list(itertools.product([True, False], repeat=D)))

    patterns[:, i] = False

    cnt = np.dot(patterns, P)

    score = np.dot(patterns, comp_scores)

    add_cnt = np.maximum(0, np.minimum(P[i] - 1, np.ceil((G - score) / A[i])))

    add_score = A[i] * add_cnt

    ok = score + add_score >= G

    if any(ok):

        ans = min(ans, ((cnt + add_cnt)[ok]).min())

print((int(ans)))

import bisect
import heapq
import itertools
import math
import os
import re
import string
import sys
from collections import Counter, deque, defaultdict
from decimal import Decimal
from fractions import gcd
from functools import lru_cache, reduce
from operator import itemgetter
import numpy as np

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(2147483647)
INF = float("inf")
IINF = 10**18
MOD = 10**9 + 7
D, G = list(map(int, sys.stdin.readline().split()))
P, C = list(zip(*[list(map(int, sys.stdin.readline().split())) for _ in range(D)]))
P = np.array(P, dtype=int)
C = np.array(C, dtype=int)
A = np.arange(1, D + 1, dtype=int) * 100  # 1問のスコア
comp_scores = P * A + C
ans = P.sum()
for i in range(D):
    # i: 途中まで解く
    # comp: True ならその問題は全部解く
    for comp in itertools.product([True, False], repeat=D):
        comp = np.array(comp)
        comp[i] = False
        cnt = P[comp].sum()
        score = comp_scores[comp].sum()
        add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i])))
        add_score = A[i] * add_cnt
        if score + add_score >= G:
            ans = min(ans, cnt + add_cnt)
print(ans)

import itertools
import os
import sys
import numpy as np

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(2147483647)
INF = float("inf")
IINF = 10**18
MOD = 10**9 + 7
D, G = list(map(int, sys.stdin.readline().split()))
P, C = list(zip(*[list(map(int, sys.stdin.readline().split())) for _ in range(D)]))
P = np.array(P, dtype=int)
C = np.array(C, dtype=int)
A = np.arange(1, D + 1, dtype=int) * 100  # 1問のスコア
comp_scores = P * A + C
# ans = P.sum()
# for i in range(D):
#     # i: 途中まで解く
#     # comp: True ならその問題は全部解く
#     for comp in itertools.product([True, False], repeat=D):
#         comp = np.array(comp)
#         comp[i] = False
#         cnt = P[comp].sum()
#         score = comp_scores[comp].sum()
#         add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i])))
#         add_score = A[i] * add_cnt
#         if score + add_score >= G:
#             ans = min(ans, cnt + add_cnt)
# print(ans)
ans = P.sum()
for i in range(D):
    # i: 途中まで解く
    # True なら全部解く、False なら 1 問も説かない
    patterns = np.array(list(itertools.product([True, False], repeat=D)))
    patterns[:, i] = False
    cnt = np.dot(patterns, P)
    score = np.dot(patterns, comp_scores)
    add_cnt = np.maximum(0, np.minimum(P[i] - 1, np.ceil((G - score) / A[i])))
    add_score = A[i] * add_cnt
    ok = score + add_score >= G
    if any(ok):
        ans = min(ans, ((cnt + add_cnt)[ok]).min())
print((int(ans)))

-import bisect -import heapq -import math -import re -import string -from collections import Counter, deque, defaultdict -from decimal import Decimal -from fractions import gcd -from functools import lru_cache, reduce -from operator import itemgetter +# ans = P.sum() +# for i in range(D): +#     # i: 途中まで解く +#     # comp: True ならその問題は全部解く +#     for comp in itertools.product([True, False], repeat=D): +#         comp = np.array(comp) +#         comp[i] = False +#         cnt = P[comp].sum() +#         score = comp_scores[comp].sum() +#         add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i]))) +#         add_score = A[i] * add_cnt +#         if score + add_score >= G: +#             ans = min(ans, cnt + add_cnt) +# print(ans) -    # comp: True ならその問題は全部解く -    for comp in itertools.product([True, False], repeat=D): -        comp = np.array(comp) -        comp[i] = False -        cnt = P[comp].sum() -        score = comp_scores[comp].sum() -        add_cnt = max(0, min(P[i] - 1, math.ceil((G - score) / A[i]))) -        add_score = A[i] * add_cnt -        if score + add_score >= G: -            ans = min(ans, cnt + add_cnt) -print(ans) +    # True なら全部解く、False なら 1 問も説かない +    patterns = np.array(list(itertools.product([True, False], repeat=D))) +    patterns[:, i] = False +    cnt = np.dot(patterns, P) +    score = np.dot(patterns, comp_scores) +    add_cnt = np.maximum(0, np.minimum(P[i] - 1, np.ceil((G - score) / A[i]))) +    add_score = A[i] * add_cnt +    ok = score + add_score >= G +    if any(ok): +        ans = min(ans, ((cnt + add_cnt)[ok]).min()) +print((int(ans)))