// util
let scanInt () = stdin.ReadLine() |> int
let scanInts () = stdin.ReadLine().Split() |> Array.map int
let scanIntML n = [ for i in 1..n -> scanInt () ]
let scanIntsML n = [ for i in 1..n -> scanInts () ]
let frceil a b = a/b + (if a % b = 0 then 0 else 1)
let rec powerset = function
  | [] -> [[]]
  | x::xs -> let ps = powerset xs in ps @ List.map (List.append [x]) ps

// main
let [|D;G|] = scanInts ()

let alltup =
  scanIntsML D
  |> List.mapi (fun i a -> ((i+1)*100, a.[0], a.[1])) // (point, num, bonus)
  |> List.rev // （ボーナス抜きでの）コスパで並べる

// 完全回答組が与えられたとき 中途を（必要があれば）一つ選んで総回数を返す
let trySelect ctups =
  let cnt = List.sumBy (fun (_,n,_) -> n) ctups
  let scr = List.sumBy (fun (p,n,b) -> b+p*n) ctups
  match G - scr with
    | tgt when tgt <= 0 -> Some(cnt) // 中途を選ぶ必要がない
    | tgt ->
        alltup // 候補は完全組でなく, 単独で目標を達成しうるものの 先頭
        |> List.filter (fun t -> not (List.contains t ctups))
        |> List.filter (fun (p,n,_) -> tgt <= p*(n-1))
        |> List.map (fun (p,n,_) -> cnt + (frceil tgt p))
        |> List.tryHead // コスパソート済みなので先頭でよい

alltup
|> powerset
|> List.map trySelect
|> List.choose id
|> List.min
|> printfn "%d"