D,G = list(map(int,input().split()))

PC = []



L = []



t = 10 ** 9

m = 0



for i in range(1,D + 1):

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

  s = 0

  pc = []

  for j in range(p):

    s += i * 100

    if j == p - 1:

      s += c

      L.append([j + 1,s])

    if s >= G and j + 1 < t:

      t = j + 1

    pc.append([j + 1,s])

  PC.append(pc)



def recur(problems):

  #探索の終了

  if len(problems) == D:

    ans = 10 ** 9

    score = 0

    times = 0

    #全部使用した問題セットの合計点と回答数を記録

    for j in range(D):

      if problems[j] == 1:

        score += L[j][1]

        times += L[j][0]

    #全問全回答の例を除く

    if score >= G:

      ans = min(ans,times)

      return ans

    #残りの数以上となる回答数のうち最小のものが見つかれば更新し

    #全回答の回答数に足す

    else:

      remain = G - score

      if remain <= max([L[i][1] for i in range(D) if problems[i] == 0]):

        for k in range(D):

          if problems[k] == 0:

            for l in range(len(PC[k])):

              if remain <= PC[k][l][1] and ans >= PC[k][l][0]:

                ans = PC[k][l][0]

        ans += times

        return ans

      else:

        return 10 ** 9

  

  else:

    #問題セットを全部使う

    ret1 = recur(problems + [1])

    #使わない

    ret2 = recur(problems + [0])

    

    return min(ret1,ret2)



print((recur([])))



import math

D, G = list(map(int, input().split()))



PC = []

for _ in range(D):

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

    PC.append([p, c])



ans = 10 ** 9



#全部解く・解かないが2のD乗通りになる

for i in range(2 ** D):

    score = 0

    time = 0

    maxj = -1

    #全部解く場合

    for j in range(D):

    #jケタ落としていき、jケタめ == 1であれば、つまりj番目の問題セットを全部解いていれば

        if ((i >> j) & 1):

            score += (j + 1) * PC[j][0] * 100 + PC[j][1]

            time += PC[j][0]

        #全てを解かなかった問題セットのうち最も大きいj

        ##全て解かない問題セットは1つでよく、最大の素点のもの=一番大きいjでよい

        else:

            maxj = max(maxj,j)

    #全てを全部解いた場合

    if maxj == -1:

      ans = min(ans, time)

    #jケタめを全て使わずにG以上のスコアとなった場合

    elif score + (maxj + 1) * (PC[maxj][0] - 1) * 100 >= G:

        #必要な最小問題数を小数点切り上げで求める

        ##残りが500点であったとき、300点問題なら2問、200点問題なら3問解けばよい

        time += max(0, math.ceil((G - score) / (maxj + 1) / 100))

        #最小のものを更新していく

        ans = min(ans, time)



print(ans)



D, G = list(map(int, input().split()))
PC = []
L = []
t = 10**9
m = 0
for i in range(1, D + 1):
    p, c = list(map(int, input().split()))
    s = 0
    pc = []
    for j in range(p):
        s += i * 100
        if j == p - 1:
            s += c
            L.append([j + 1, s])
        if s >= G and j + 1 < t:
            t = j + 1
        pc.append([j + 1, s])
    PC.append(pc)


def recur(problems):
    # 探索の終了
    if len(problems) == D:
        ans = 10**9
        score = 0
        times = 0
        # 全部使用した問題セットの合計点と回答数を記録
        for j in range(D):
            if problems[j] == 1:
                score += L[j][1]
                times += L[j][0]
        # 全問全回答の例を除く
        if score >= G:
            ans = min(ans, times)
            return ans
        # 残りの数以上となる回答数のうち最小のものが見つかれば更新し
        # 全回答の回答数に足す
        else:
            remain = G - score
            if remain <= max([L[i][1] for i in range(D) if problems[i] == 0]):
                for k in range(D):
                    if problems[k] == 0:
                        for l in range(len(PC[k])):
                            if remain <= PC[k][l][1] and ans >= PC[k][l][0]:
                                ans = PC[k][l][0]
                ans += times
                return ans
            else:
                return 10**9
    else:
        # 問題セットを全部使う
        ret1 = recur(problems + [1])
        # 使わない
        ret2 = recur(problems + [0])
        return min(ret1, ret2)


print((recur([])))

import math

D, G = list(map(int, input().split()))
PC = []
for _ in range(D):
    p, c = list(map(int, input().split()))
    PC.append([p, c])
ans = 10**9
# 全部解く・解かないが2のD乗通りになる
for i in range(2**D):
    score = 0
    time = 0
    maxj = -1
    # 全部解く場合
    for j in range(D):
        # jケタ落としていき、jケタめ == 1であれば、つまりj番目の問題セットを全部解いていれば
        if (i >> j) & 1:
            score += (j + 1) * PC[j][0] * 100 + PC[j][1]
            time += PC[j][0]
        # 全てを解かなかった問題セットのうち最も大きいj
        ##全て解かない問題セットは1つでよく、最大の素点のもの=一番大きいjでよい
        else:
            maxj = max(maxj, j)
    # 全てを全部解いた場合
    if maxj == -1:
        ans = min(ans, time)
    # jケタめを全て使わずにG以上のスコアとなった場合
    elif score + (maxj + 1) * (PC[maxj][0] - 1) * 100 >= G:
        # 必要な最小問題数を小数点切り上げで求める
        ##残りが500点であったとき、300点問題なら2問、200点問題なら3問解けばよい
        time += max(0, math.ceil((G - score) / (maxj + 1) / 100))
        # 最小のものを更新していく
        ans = min(ans, time)
print(ans)

+import math + -L = [] -t = 10**9 -m = 0 -for i in range(1, D + 1): +for _ in range(D): -    s = 0 -    pc = [] -    for j in range(p): -        s += i * 100 -        if j == p - 1: -            s += c -            L.append([j + 1, s]) -        if s >= G and j + 1 < t: -            t = j + 1 -        pc.append([j + 1, s]) -    PC.append(pc) - - -def recur(problems): -    # 探索の終了 -    if len(problems) == D: -        ans = 10**9 -        score = 0 -        times = 0 -        # 全部使用した問題セットの合計点と回答数を記録 -        for j in range(D): -            if problems[j] == 1: -                score += L[j][1] -                times += L[j][0] -        # 全問全回答の例を除く -        if score >= G: -            ans = min(ans, times) -            return ans -        # 残りの数以上となる回答数のうち最小のものが見つかれば更新し -        # 全回答の回答数に足す +    PC.append([p, c]) +ans = 10**9 +# 全部解く・解かないが2のD乗通りになる +for i in range(2**D): +    score = 0 +    time = 0 +    maxj = -1 +    # 全部解く場合 +    for j in range(D): +        # jケタ落としていき、jケタめ == 1であれば、つまりj番目の問題セットを全部解いていれば +        if (i >> j) & 1: +            score += (j + 1) * PC[j][0] * 100 + PC[j][1] +            time += PC[j][0] +        # 全てを解かなかった問題セットのうち最も大きいj +        ##全て解かない問題セットは1つでよく、最大の素点のもの=一番大きいjでよい -            remain = G - score -            if remain <= max([L[i][1] for i in range(D) if problems[i] == 0]): -                for k in range(D): -                    if problems[k] == 0: -                        for l in range(len(PC[k])): -                            if remain <= PC[k][l][1] and ans >= PC[k][l][0]: -                                ans = PC[k][l][0] -                ans += times -                return ans -            else: -                return 10**9 -    else: -        # 問題セットを全部使う -        ret1 = recur(problems + [1]) -        # 使わない -        ret2 = recur(problems + [0]) -        return min(ret1, ret2) - - -print((recur([]))) +            maxj = max(maxj, j) +    # 全てを全部解いた場合 +    if maxj == -1: +        ans = min(ans, time) +    # jケタめを全て使わずにG以上のスコアとなった場合 +    elif score + (maxj + 1) * (PC[maxj][0] - 1) * 100 >= G: +        # 必要な最小問題数を小数点切り上げで求める +        ##残りが500点であったとき、300点問題なら2問、200点問題なら3問解けばよい +        time += max(0, math.ceil((G - score) / (maxj + 1) / 100)) +        # 最小のものを更新していく +        ans = min(ans, time) +print(ans)