#include <bits/stdc++.h>
using namespace std;

int main(){
  int D, G;
  cin >> D >> G;
  if(D<1 || D>10 || G<100 || G%100){
    return 0;
  }
  using pii = pair<int, int>; // first: 問題数, second: コンプリート加算
  vector<pii> PV(D);
  for(int i=0; i<D; ++i){
    cin >> PV.at(i).first >> PV.at(i).second;
    if(PV.at(i).second%100){ // コンプリート加算が100の倍数でない場合はerror
      return 0;
    }
  }
  // check
  if(0){
    cerr << D << " " << G << endl;
    for(int i=0; i<D; ++i){
      cerr << PV.at(i).first << " " << PV.at(i).second << endl;
    }
  }
  // 得点は全て100の倍数なので1/100する。
  G = G / 100;
  for(int i=0; i<D; ++i){
    PV.at(i).second = PV.at(i).second / 100;
  }
  // check
  if(0){
    cerr << D << " " << G << endl;
    for(int i=0; i<D; ++i){
      cerr << PV.at(i).first << " " << PV.at(i).second << endl;
    }
  }

  // minに解答する問題数の最小値が入る。
  int min = INT_MAX; // minの初期値として最大の整数を入れておく。
  // check
  if(0){
    cerr << "INT_MAX: " << INT_MAX << endl;
  }
  
  // 合計点がG以下のcompleteの組み合わせ全てについて調べる。
  for(int i=0; i<(1<<D); ++i){
    vector<bool> isComp(D, false); // isComp.at(j)==true → 問題(j+1)をコンプリート
    int totalPoint = 0; // 合計点
    int totalNum = 0; // 解答した問題数の合計
    bool isSatisfy = true;
    for(int j=0; j<D; ++j){
      // iはcompleteの組み合わせを表す。
      // iのj bit目が1 → 問題(j+1)がコンプリート(j = 0, ..., D-1)
      // (例)
      // D=3とする。今i=6とすると i=110(2)である。これは以下を意味する。
      //   0bit目: 0 → 問題1(==0+1)はコンプリートしていない。
      //   1bit目: 1 → 問題2(==1+1)はコンピリートしている。
      //   2bit目: 1 → 問題3(==2+1)はコンプリートしている。
      if(i&(1<<j)){
        // 問題(j+1)をコンプリート
        if(totalPoint + (j+1)*PV.at(j).first + PV.at(j).second > G){
          // 合計点がGを超えてしまう。
          // 全てのcompleteの合計を出さずにbreakしてしまうが問題ない。
          isSatisfy = false;
          break;
        }
        else{
          totalPoint += (j+1)*PV.at(j).first + PV.at(j).second;
          totalNum += PV.at(j).first;
          isComp.at(j) = true;
        }
      }
    }
    if(!isSatisfy){
      continue;
    }
    // check
    if(0){
      cerr << "(i, totalPoint, totalNum): "
        << "(" << i << ", " << totalPoint << ", " << totalNum << ")" << endl;
      cerr << "isComp:: ";
      for(int j=0; j<D; j++){
        cerr << j << ":" << isComp.at(j) << "  ";
      }
      cerr << endl;
    }

    int r = G - totalPoint;
    if(r>0){
      // complete以外の解答数を計算する
      int additionalNum = 0;
      for(int j=D-1; j>=0; --j){
        if(isComp.at(j)){
          // 既にコンプリートしている場合
          continue;
        }
        if(r > (j+1)*(PV.at(j).first -1)){
          // (全問題数-1)を解いても点数がrを超えない場合
          continue;
        }
        if(0){
          cerr << r << " <= " << (j+1)*(PV.at(j).first -1) << endl;
        }
        additionalNum = r/(j+1); // (j+1): 1問解いた時の得点
        if(r%(j+1)){
          additionalNum++;
        }
        // 条件を満たす一番大きい問題番号のものが見つかれば抜ける。
        break;
      }
      // 合計がrを超えるが、合計数が上記additionalNumより小さいcompleteがあるか調べる
      for(int j=0; j<D; ++j){
        if(!isComp.at(j)){
          if((additionalNum==0 || PV.at(j).first < additionalNum) && 
             ((j+1)*PV.at(j).first + PV.at(j).second > r)){
            if(additionalNum==0 || additionalNum > PV.at(j).first){
              additionalNum = PV.at(j).first;
            }
          }
        }
      }
      if(additionalNum > 0){
        totalNum += additionalNum;
        if(0){
          cerr << "(min, totalNum): (" << min << ", " << totalNum << ")" << endl;
        }
        if(min>totalNum){
          min = totalNum;
          if(0){
            cerr << "(i , min): " << "(" << i << ", " << min << ")" << endl;
          }
        }
      }
    }
    else{ // r==0の場合
      if(0){
        cerr << "(min, totalNum): (" << min << ", " << totalNum << ")" << endl;
      }
      if(min>totalNum){
        min = totalNum;
        if(0){
          cerr << "(i , min): " << "(" << i << ", " << min << ")" << endl;
        }
      }
    }
  }  
  cout << min << endl;
}

Measured memory_bytes: 256