unittest
{
	assert( [ "2 700", "3 500", "5 800" ].solve == 3 );
	assert( [ "2 2000", "3 500", "5 800" ].solve == 7 );
	assert( [ "2 400", "3 500", "5 800" ].solve == 2 );
	assert( [ "5 25000", "20 1000", "40 1000", "50 1000", "30 1000", "1 1000" ].solve == 66 );
}



import std.algorithm;
import std.conv;
import std.format;
import std.range;
import std.stdio;

void main()
{
	stdin.byLineCopy.solve.writeln;
}

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto d = 0L;
	auto g = 0L;
	input.front.formattedRead!"%s %s"( d, g );
	auto pcs = new long[ 2 ][ d ];
	foreach( ref pc; pcs )
	{
		input.popFront;
		pc = input.front.split.to!( long[] );
	}
	
	// 各問題セットを全問解くパターンをbit全探索
	auto ans = long.max;
	foreach( b; 0L .. 1L << d )
	{
		auto z = 0L;
		auto t = 0L;
		auto m = 0L;
		
		// 全問解く問題セットの合計点数を計算
		foreach( i, pc; pcs )
		{
			if( b & ( 1L << i ) )
			{
				auto s = 100L * ( 1 + i.signed );
				z += pc[ 0 ];
				t += s * pc[ 0 ] + pc[ 1 ];
			}
			else
			{
				m = i.signed;
			}
		}
		
		// 解いていない問題セットのうち、一番点数が高いセットで不足分の点数を計算
		auto s = 100L * ( 1 + m );
		auto r = ( max( 0L, g - t ) + s - 1 ) / s;
		if( r <= pcs[ m ][ 0 ] && g <= t + s * r ) ans = min( ans, z + r );
	}
	return ans;
}
