#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

struct item{
  int value;
  int weight;
};

int max(int a,int b)
{
  if(a>b)
    return a;
  else 
    return b;
}

int main(void)
{
  int N,W,i,j,**c,**g,w;
  struct item *a;
  scanf("%d %d",&N,&W);
  a=malloc(sizeof(struct item)*N);
  for(i=0;i<N;i++)
    scanf("%d %d",&a[i].value,&a[i].weight);

  c=malloc(sizeof(int *)*(N+1));
  for(i=0;i<M+1;i++)
    c[i]=malloc(sizeof(int)*(W+1));
  
  for(i=0;i<W+1;i++)
    c[0][i]=0;
  for(i=1;i<N+1;i++)
    c[i][0]=0;
  
  for(i=1;i<N+1;i++)
    for(w=1;w<W+1;w++){
      if(a[i].item<=w)
	c[i][w]=max(c[i-1][w],c[i-1][w-a[i].weight]);
      else 
	c[i][w]=c[i-1][w];
    }
  printf("%d\n",c[N][W]);

  return 0;
}