Problem:
Score : 300 points

Problem Statement

A programming competition site AtCode provides algorithmic problems.
Each problem is allocated a score based on its difficulty.
Currently, for each integer i between 1 and D (inclusive), there are p_i problems with a score of 100i points.
These p_1 + … + p_D problems are all of the problems available on AtCode.

A user of AtCode has a value called total score.
The total score of a user is the sum of the following two elements:

Base score: the sum of the scores of all problems solved by the user.

Perfect bonuses: when a user solves all problems with a score of 100i points, he/she earns the perfect bonus of c_i points, aside from the base score (1 ≤ i ≤ D).

Takahashi, who is the new user of AtCode, has not solved any problem.
His objective is to have a total score of G or more points.
At least how many problems does he need to solve for this objective?

Constraints

1 ≤ D ≤ 10

1 ≤ p_i ≤ 100

100 ≤ c_i ≤ 10^6

100 ≤ G

All values in input are integers.

c_i and G are all multiples of 100.

It is possible to have a total score of G or more points.

Input

Input is given from Standard Input in the following format:

D G
p_1 c_1
:
p_D c_D

Output

Print the minimum number of problems that needs to be solved in order to have a total score of G or more points. Note that this objective is always achievable (see Constraints).

Sample Input 1

2 700
3 500
5 800

Sample Output 1

3

In this case, there are three problems each with 100 points and five problems each with 200 points. The perfect bonus for solving all the 100-point problems is 500 points, and the perfect bonus for solving all the 200-point problems is 800 points. Takahashi's objective is to have a total score of 700 points or more.

One way to achieve this objective is to solve four 200-point problems and earn a base score of 800 points. However, if we solve three 100-point problems, we can earn the perfect bonus of 500 points in addition to the base score of 300 points, for a total score of 800 points, and we can achieve the objective with fewer problems.

Sample Input 2

2 2000
3 500
5 800

Sample Output 2

7

This case is similar to Sample Input 1, but the Takahashi's objective this time is 2000 points or more. In this case, we inevitably need to solve all five 200-point problems, and by solving two 100-point problems additionally we have the total score of 2000 points.

Sample Input 3

2 400
3 500
5 800

Sample Output 3

2

This case is again similar to Sample Input 1, but the Takahashi's objective this time is 400 points or more. In this case, we only need to solve two 200-point problems to achieve the objective.

Sample Input 4

5 25000
20 1000
40 1000
50 1000
30 1000
1 1000

Sample Output 4

66

There is only one 500-point problem, but the perfect bonus can be earned even in such a case.

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
int gcd(int a,int b){return b?gcd(b,a%b):a;}
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}

bool expected_value(const tuple<int,int,int> &lhs,const tuple<int,int,int> &rhs) {
    auto l = get<0>(lhs) * get<1>(lhs) + get<2>(lhs);
    auto r = get<0>(rhs) * get<1>(rhs) + get<2>(rhs);
    return l/get<1>(lhs) < r/get<1>(rhs);
}


int D,G;
vector<pair<int,int>> v(D+1,make_pair(0,0));
int dfs(int ndep,int cost,int score,const int &banned) {
    if (ndep==D+1) {
        // debug
        int g=G;
        int d=D;
        cerr << "!return! ";
        cerr << " cost: " << cost;
        cerr << " dep:" << ndep << "  score:" << score << endl;
        int av = (v[banned].first-1)*100*banned;
        // 条件を満たしてないならINFで返す。
        if (G>(av+score)) return INF;
        if (G<score) return cost;
        int last = G-score;
        int pcts = (last+(banned*100-1))/(banned*100);
        return cost+pcts;
    }
    int use=INF;
    int ns = v[ndep].first*100*ndep+v[ndep].second;
    // use
    if (ndep!=banned) use=dfs(ndep+1,cost+v[ndep].first,score+ns,banned);
    int pass=dfs(ndep+1,cost,score,banned);

    cerr << "ns: " << ns;
    cerr << " cost: " << cost;
    cerr << " banned:" << banned << " use: " << use << " pass: " << pass;
    cerr << " dep:" << ndep << "  score:" << score << endl;
    return min(use,pass);
}

int main() {
    cin >> D >> G;

    v[0] = make_pair(0,0);
    REP(i,D) {
        int p,c;
        cin >> p >> c;
        v[i+1]=make_pair(p,c);
    }
    int score=INF;
    FOR(i,1,D+1) {
        chmin(score,dfs(1,0,0,i));
    }
    cout << score << endl;
    return 0;
}