fun main(args: Array<String>) {
    val (d, g) = readLine()!!.split(" ").map { it.toInt() }

    // 通常スコアとコンプリートスコアがある
    // 問題を解くことで目標G 以上のスコアを獲得するのに解かなくてはいけない最小問題数は？

    // どのコンプボーナスを取るのか -> d < 10 -> 2^10 パターン
    // 必要なコンプボーナスを取って，後はスコアが高い順に上から埋めていけば OK
    // 2^10 パターンで G 以上となったときの問題数が一番少ないケースを求める

    val p = LongArray(d)
    val c = LongArray(d)
    for (i in 0 until d) {
        val (a, b) = readLine()!!.split(" ").map { it.toLong() }
        p[i] = a
        c[i] = b
    }

    var ans = Long.MAX_VALUE

    // パターンをどうやって表現するか？？
    for (i in 0..(Math.pow(2.0, d.toDouble()).toInt()-1) ) {

        // 0 埋めした２進数表現を取得
        val binaryRep = Integer.toBinaryString(i).toInt()
        val bs = "%0${d}d".format(binaryRep)

        val pTmp = p.clone()
        val cTmp = c.clone()

        var score = 0L
        var cnt = 0L
        // 使い切る問題を使い切る
        for ((j, ch) in bs.withIndex()) {
            if (ch == '1') {
                score += (j + 1) * 100 * pTmp[j] + cTmp[j]
                cnt += pTmp[j]
                pTmp[j] = 0
            }
        }

        // 残った問題を足していく
        // すべて使いきらない問題に対して大きい方から使う
        for (j in bs.lastIndex downTo 0) {
            if (score >= g) break

            if (bs[j] == '0') {
                // 問題を１問残すところまで使い切る
                while (score < g && pTmp[j] != 0L) {
                    score += (j + 1) * 100
                    cnt += 1
                    pTmp[j] -= 1L
                }
            }
        }

        if (score >= g) {
            ans = if (cnt < ans) cnt else ans
        }
    }

    println(ans)
}