"All Green"



"""

考え方

その点数の問題を全て解く or 1問も解かないをbit全探索で分けて処理を行い、目標点に到達していない

ならば、配点の高い問題から一問ずつ解いて確認していく。

"""



D, G = list(map(int, input().split()))  # 与えられる問題数のスコアのレンジD, 目標の点数G



PC = []  # 100i点の問題の個数とコンプリートボーナス

ans = 99999999

for i in range(D):

    p, c = list(map(int, input().split()))

    score = (i+1)*100

    PC.append([score, p, c])



for mask in range(1 << D):  # D種類の問題について解くか解かないかの二択を考える

    solved_amount = 0

    my_score = 0

    for i in range(D):

        score, p, c = PC[i]  # その問題のscore, 問題数のp, コンプリートしたらc

        if (mask >> i) & 1:  # ビットが立つならその問題を全て解くことにする

            solved_amount += p  # 解いた問題数を増やして

            my_score += score * p + c  # スコアを加算する



    for i in range(D-1, -1, -1):  # 目標点Gに達していない時の処理、配点の高い問題から考えている

        if my_score >= G:  # すでに目標点数に到達していたら終了して、解いた問題の量を保持しにいく

            break



        if (mask >> i) & 1:  # すでにその問題を解いていたらもう解けないので次の配点の問題へ

            continue



        score, p, c = PC[i]  # 今部分的に解こうとしている問題のscore, 問題数のp, コンプリートしたらc

        # 今スコアは超えていない状態

        for _ in range(p):

            # 一問ずつ解いて超えるラインを探す

            solved_amount += 1

            my_score += score

            if my_score >= G:

                break

    if my_score >= G:

        ans = min(ans, solved_amount)



print(ans)

# この問題はbit全探索で解く

D, G = list(map(int, input().split()))  # 1~Dのスコア帯, 目標の点数G

# 問題を受け取る

problems = [list(map(int, input().split())) for _ in range(D)]  # pi問存在している, ボーナスci点



# 状態を列挙する

all_status = []

for i in range(1 << D):

    tmp = []

    for j in range(D):

        if (i >> j) & 1:

            tmp.append(1)

        else:

            tmp.append(0)

    all_status.append(tmp)

# 状態の列挙が終わった

ans = float('inf')

for status in all_status:

    # status中の1が立っている部分の問題を全て解く

    score = 0

    solve_count = 0

    for i in range(len(status)):

        if status[i] == 1:

            # i番目の問題を全て解く

            score += (i+1)*100*problems[i][0] + problems[i][1]

            solve_count += problems[i][0]

    # 対象の問題を全部解き終えた

    if score >= G:

        ans = min(ans, solve_count)

    else:

        # 足りない問題を解く

        for i in reversed(list(range(len(status)))):

            if status[i] == 0:  # 解いていない問題の中で一番ポイントが高いものを解く

                for j in range(problems[i][0]):  # 1問ずつ解く

                    score += (i+1)*100

                    solve_count += 1

                    if score >= G:

                        ans = min(ans, solve_count)

                        break

                break

print(ans)

"All Green"
"""
考え方
その点数の問題を全て解く or 1問も解かないをbit全探索で分けて処理を行い、目標点に到達していない
ならば、配点の高い問題から一問ずつ解いて確認していく。
"""
D, G = list(map(int, input().split()))  # 与えられる問題数のスコアのレンジD, 目標の点数G
PC = []  # 100i点の問題の個数とコンプリートボーナス
ans = 99999999
for i in range(D):
    p, c = list(map(int, input().split()))
    score = (i + 1) * 100
    PC.append([score, p, c])
for mask in range(1 << D):  # D種類の問題について解くか解かないかの二択を考える
    solved_amount = 0
    my_score = 0
    for i in range(D):
        score, p, c = PC[i]  # その問題のscore, 問題数のp, コンプリートしたらc
        if (mask >> i) & 1:  # ビットが立つならその問題を全て解くことにする
            solved_amount += p  # 解いた問題数を増やして
            my_score += score * p + c  # スコアを加算する
    for i in range(D - 1, -1, -1):  # 目標点Gに達していない時の処理、配点の高い問題から考えている
        if my_score >= G:  # すでに目標点数に到達していたら終了して、解いた問題の量を保持しにいく
            break
        if (mask >> i) & 1:  # すでにその問題を解いていたらもう解けないので次の配点の問題へ
            continue
        score, p, c = PC[i]  # 今部分的に解こうとしている問題のscore, 問題数のp, コンプリートしたらc
        # 今スコアは超えていない状態
        for _ in range(p):
            # 一問ずつ解いて超えるラインを探す
            solved_amount += 1
            my_score += score
            if my_score >= G:
                break
    if my_score >= G:
        ans = min(ans, solved_amount)
print(ans)

# この問題はbit全探索で解く
D, G = list(map(int, input().split()))  # 1~Dのスコア帯, 目標の点数G
# 問題を受け取る
problems = [list(map(int, input().split())) for _ in range(D)]  # pi問存在している, ボーナスci点
# 状態を列挙する
all_status = []
for i in range(1 << D):
    tmp = []
    for j in range(D):
        if (i >> j) & 1:
            tmp.append(1)
        else:
            tmp.append(0)
    all_status.append(tmp)
# 状態の列挙が終わった
ans = float("inf")
for status in all_status:
    # status中の1が立っている部分の問題を全て解く
    score = 0
    solve_count = 0
    for i in range(len(status)):
        if status[i] == 1:
            # i番目の問題を全て解く
            score += (i + 1) * 100 * problems[i][0] + problems[i][1]
            solve_count += problems[i][0]
    # 対象の問題を全部解き終えた
    if score >= G:
        ans = min(ans, solve_count)
    else:
        # 足りない問題を解く
        for i in reversed(list(range(len(status)))):
            if status[i] == 0:  # 解いていない問題の中で一番ポイントが高いものを解く
                for j in range(problems[i][0]):  # 1問ずつ解く
                    score += (i + 1) * 100
                    solve_count += 1
                    if score >= G:
                        ans = min(ans, solve_count)
                        break
                break
print(ans)

-"All Green" -""" -考え方 -その点数の問題を全て解く or 1問も解かないをbit全探索で分けて処理を行い、目標点に到達していない -ならば、配点の高い問題から一問ずつ解いて確認していく。 -""" -D, G = list(map(int, input().split()))  # 与えられる問題数のスコアのレンジD, 目標の点数G -PC = []  # 100i点の問題の個数とコンプリートボーナス -ans = 99999999 -for i in range(D): -    p, c = list(map(int, input().split())) -    score = (i + 1) * 100 -    PC.append([score, p, c]) -for mask in range(1 << D):  # D種類の問題について解くか解かないかの二択を考える -    solved_amount = 0 -    my_score = 0 -    for i in range(D): -        score, p, c = PC[i]  # その問題のscore, 問題数のp, コンプリートしたらc -        if (mask >> i) & 1:  # ビットが立つならその問題を全て解くことにする -            solved_amount += p  # 解いた問題数を増やして -            my_score += score * p + c  # スコアを加算する -    for i in range(D - 1, -1, -1):  # 目標点Gに達していない時の処理、配点の高い問題から考えている -        if my_score >= G:  # すでに目標点数に到達していたら終了して、解いた問題の量を保持しにいく -            break -        if (mask >> i) & 1:  # すでにその問題を解いていたらもう解けないので次の配点の問題へ -            continue -        score, p, c = PC[i]  # 今部分的に解こうとしている問題のscore, 問題数のp, コンプリートしたらc -        # 今スコアは超えていない状態 -        for _ in range(p): -            # 一問ずつ解いて超えるラインを探す -            solved_amount += 1 -            my_score += score -            if my_score >= G: +# この問題はbit全探索で解く +D, G = list(map(int, input().split()))  # 1~Dのスコア帯, 目標の点数G +# 問題を受け取る +problems = [list(map(int, input().split())) for _ in range(D)]  # pi問存在している, ボーナスci点 +# 状態を列挙する +all_status = [] +for i in range(1 << D): +    tmp = [] +    for j in range(D): +        if (i >> j) & 1: +            tmp.append(1) +        else: +            tmp.append(0) +    all_status.append(tmp) +# 状態の列挙が終わった +ans = float("inf") +for status in all_status: +    # status中の1が立っている部分の問題を全て解く +    score = 0 +    solve_count = 0 +    for i in range(len(status)): +        if status[i] == 1: +            # i番目の問題を全て解く +            score += (i + 1) * 100 * problems[i][0] + problems[i][1] +            solve_count += problems[i][0] +    # 対象の問題を全部解き終えた +    if score >= G: +        ans = min(ans, solve_count) +    else: +        # 足りない問題を解く +        for i in reversed(list(range(len(status)))): +            if status[i] == 0:  # 解いていない問題の中で一番ポイントが高いものを解く +                for j in range(problems[i][0]):  # 1問ずつ解く +                    score += (i + 1) * 100 +                    solve_count += 1 +                    if score >= G: +                        ans = min(ans, solve_count) +                        break -    if my_score >= G: -        ans = min(ans, solved_amount)