#include <bits/stdc++.h>
using namespace std;
#define _USE_MATH_DEFINES
#include <cmath>
 long long MOD=1000000007;
// vector<long long > t(4*100001);
long long binary_exp(long long a,long long b)
{
  long long ans=1;
  while(b>0)
  {
    if(b&1)
    {
      ans=(ans*a)%MOD;
    }
    a=(a*a)%MOD;
    b=b>>1;
  }
  return ans;
}
// long long gcd(long long a,long long b)
// {
//   if(b>a)
//   {
//     return gcd(b,a);
//   }
//   if(b==0)
//   {
//     return a;
//   }
//   else
//   {
//     return gcd(b,a%b);
//   }
// }
class comp{
public:
    bool operator()(pair<long long ,long long > a,pair<long long ,long long > b)
{
  if(a.first>b.first)
  {
    return false;
  }
  else if(a.first==b.first && a.second<b.second)
  {
    return false;
  }
  else
  {
    return true;
  }
 }
};
// void buildseg(long long  x,long long  l,long long  r,vector<long long > &a,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=a[l]%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     buildseg(2*x+1,l,mid,a,modi);
//     buildseg(2*x+2,mid+1,r,a,modi);
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// long long  sum(long long  x,long long  l1,long long  r1,long long  l,long long  r,long long  modi)
// {
//   if(l>r)
//   {
//     return 0;
//   }
//   else if(l1==l && r1==r)
//   {
//     return t[x];
//   }
//   else
//   {
//     long long  mid=(l1+r1)/2;
//     return (sum(2*x+1,l1,mid,l,min(r,mid),modi)+sum(2*x+2,mid+1,r1,max(l,mid+1),r,modi))%modi;
//   }
// }
// void update(long long  x,long long  l,long long  r,long long  value,long long  pos,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=value%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     if(mid>=pos)
//     {
//       update(2*x+1,l,mid,value,pos,modi);
//     }
//     else
//     {
//         update(2*x+2,mid+1,r,value,pos,modi);
//     }
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// void prdoubleseg(long long  n)
// {
//   for(long long  i=0;i<4*n;i++)
//   {
//     cout<<t[i]<<" ";
//   }
//   cout<<endl;
// }
// void dfs(double x,  vector<vector<double> > &adj,vector<set<double> > &v,double &count,vector<double> &vis)
// {
//   v[x].insert(count);
//   vis[x]=1;
//   for(auto i : adj[x])
//   {
//     if(vis[i]==0)
//     {
//       vis[i]=1;
//       dfs(i,adj,v,count,vis);
//     }
//   }
// }
void bfs(long long s,vector<vector<int> > adj,vector<int> &vis,vector<int> &pred)
  {
    queue<int> q;
    q.push(s);
    vis[s]=1;
    while(!q.empty())
    {
      long long j=q.front();
      q.pop();
    //  cout<<j<<" ";
      for(auto i:adj[j])
      {
        if(vis[i]==0)
        {
          q.push(i);
          pred[i]=j;
          vis[i]=1;
        }
      }
    }
  }
// long long  diff(long long  a ,long long  b,long long  c)
// {
//   long long  q=min(a,b);
//   q=min(q,c);
//   long long  w=max(a,b);
//   w=max(w,c);
//   return (w-q);
// }
  map<pair<int,int>,int> mp;
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long T;
  T=1;
  while(T--)
  {
    long long n,k;
    cin>>n>>k;
    vector<long long> a(n);
    vector<long long> v(n);
    for(long long i=0;i<n;i++)
    {
      cin>>a[i];
      cin>>v[i];
    }
    vector<vector<long long> > dp(n,vector<long long>(k+1,0));
   for(int w=a[0];w<=k;w++)
      dp[0][w]=v[0];

    for(long long i=1;i<n;i++)
    {
      for(long long w=1;w<=k;w++)
      {
        if((w-a[i])>0)
        dp[i][w]=max(dp[i-1][w],dp[i-1][w-a[i]]+v[i]);
        else
        dp[i][w]=dp[i-1][w];
        //cout<<i<<" "<<w<<" "<<dp[i][w]<<" "<<dp[i-1][w-a[i]]<<endl;
      }
    }
    //cout<<dp[0][3]<<" "<<dp[2][3]<<" "<<dp[0][4]<<endl;
    cout<<dp[n-1][k]<<endl;
  }
   return 0;
}


Measured memory_bytes: 79488