source_code: import java.awt.*;
  import java.awt.geom.*;
  import java.io.*;
  import java.math.*;
  import java.text.*;
  import java.util.*;
  public class B {
  	static int ourLevel;
  	public static void main(String[] args) throws IOException	{
  		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  		StringTokenizer st = new StringTokenizer(br.readLine());
  		int n = Integer.parseInt(st.nextToken());
  		int k = Integer.parseInt(st.nextToken());
  		ourLevel = Integer.parseInt(st.nextToken());
  		State[] list = new State[n];
  		for(int i = 0; i < n; i++)	{
  			st = new StringTokenizer(br.readLine());
  			list[i] = new State(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())/10);
  		}
  		System.out.println(solve(list, 0, k));
  	}
  	public static double solve(State[] s, int index, int left)		{
  		if(index == s.length)
  			return prob(s);
  		double ret = 0;
  		for(int c = 0; c <= left && s[index].prob + c <= 10; c++)	{
  			s[index].prob += c;
  			ret = Math.max(ret, solve(s, index+1, left-c));
  			s[index].prob -= c;
  		}
  		return ret;
  	}
  	public static double prob(State[] s)	{
  		double win = 1;
  		for(int i = 0; i < (1<<s.length); i++)	{
  			int numLose = s.length - Integer.bitCount(i);
  			if(2*numLose >= s.length)	{
  				int level = 0;
  				double p = 1;
  				for(int j = 0; j < s.length; j++)	{
  					if((i&(1<<j)) == 0)	{
  						p *= (10-s[j].prob)/10.;
  						level += s[j].level;
  					}
  					else	{
  						p *= s[j].prob/10.;
  					}
  				}
  				double lose = level * 1.0 / (ourLevel + level);
  				win -= p * lose;
  			}
  		}
  		return win;
  	}
  	static class State	{
  		public int level,prob;
  		public State(int a, int b)	{
  			level = a;
  			prob = b;
  		}
  	}
  }
  