{$N+}

const
  NMAX = 30;
  SMAX = 1000;

type
  TArray = array[0..SMAX] of Integer; {количества блоков}
  TParray = array[0..SMAX] of Double; {надёжности}

var
  a: array[1..NMAX] of ^TArray;       {решения на каждом шаге}
  p1,p2: TParray;                     {надёжность на предыдущем и последующем шагах}

  {Исходные данные}
  N,S: Integer;
  pp: array[1..NMAX] of Double;       {надёжности элементов}
  ss: array[1..NMAX] of Integer;      {стоимости элементов}

  i,j,k: Integer;
  pg: Double;
  ip: Double;

procedure OutAnswer(k,num: Integer);
begin
  if num>1 then OutAnswer(k-ss[num]*a[num]^[k],num-1);
  writeln(num,' ',a[num]^[k]);
end;

begin

//  assign(input,'input.txt');
  reset(input);
//  assign(output,'output.txt');
  rewrite(output);

  for k:=1 to NMAX do
  begin
    new(a[k]);
    for i:=0 to SMAX do a[k]^[i]:=-1;
  end;
  fillchar(p1,sizeof(p1),0);

  readln(N);
  for i:=1 to N do readln(pp[i],ss[i]);
  readln(S);

  ip:=1;
  for i:=0 to trunc(S/ss[1]) do {i-число дополнительно взятых блоков}
  begin
    ip := ip * (1-pp[1]);
    a[1]^[i*ss[1]] := i;
    p1[i*ss[1]] := 1 - ip;
  end;
  p2:=p1;

  for k:=2 to N do
  begin
    for i:=0 to S do p2[i] := -1;
    for i:=0 to S do {перебираем предыдущие варианты}
    begin
      if a[k-1]^[i]=-1 then continue;
      ip:=1;
      for j:=0 to trunc((S-i)/ss[k]) do
      begin
        ip := ip * (1-pp[k]);
        pg := 1 - ip;
        if p2[i+j*ss[k]]<p1[i]*pg then
        begin
          a[k]^[i+j*ss[k]] := j;
          p2[i+j*ss[k]] := p1[i]*pg;
        end;
      end;
    end;
    p1:=p2;
  end;

  j := 0;
  for i:=1 to S do
    if p2[i]>p2[j] then j:=i;
  writeln(p2[j]:0:5{,' ',j});
  {OutAnswer(j,N);}

end.
