#include<bits/stdc++.h>
using namespace std;
#define ll long long

class kanp{
public:
    ll weight, profit;
};

bool cmp(kanp sack1, kanp sack2)
{
    return sack1.profit < sack2.profit;
}

ll traditional_kanp_sack(kanp sack[], ll primes[], ll N, ll W)
{
        //dp[N][P][W]
        
        ll ***dp = new ll**[2];
        
        for(ll i = 0; i < 2; i++)
           dp[i] = new ll*[11];
           
        for(ll i = 0; i < 2; i++)
           for(ll j = 0; j < 11; j++)
              dp[i][j] = new ll[W + 1]();
              
        ll n, p, ans1, ans2;
        
        for(ll i = 1; i <= N; i++)
        {
           n = i & 1;
           
           for(ll j = 1; j < 11; j++)
           {
               p = j;
               
               for(ll w = 1; w <= W; w++)
               {
                   //cout << n << "  " << p << "  " << w << "\n";
                   
                   dp[n][p][w] = dp[n ^ 1][p][w];
                   
                   ans1 = ans2 = INT_MIN;
                   
                   if(w >= sack[i].weight)
                   {
                       ans1 = dp[n ^ 1][p][w - sack[i].weight] + sack[i].profit;
                       
                       ans2 = dp[n ^ 1][p - 1][w - sack[i].weight] + (sack[i].profit * primes[p]);
                   }
                   
                   ans1 = max(ans1, ans2);
                   
                   dp[n][p][w] = max(dp[n][p][w], ans1);
               }
           }
            
        }
        
        ans1 = dp[N & 1][10][W];
        
        for(ll i = 0; i < 2; i++)
          for(ll j = 0; j < 11; j++)
            delete [] dp[i][j];
            
        for(ll i = 0; i < 2; i++)
           delete [] dp[i];
           
           delete [] dp;
           
    return ans1;       
}

int main()
{
   ll t;

   t = 1;

   while(t--)
   {

    ll N, W;

    cin >> N >> W;

    kanp sack[N + 1];

    sack[0].weight = sack[0].profit = 0;

    for(ll i = 1; i <= N; i++)
        cin >> sack[i].profit >> sack[i].weight;;

    sort(sack, sack + N, cmp);

    ll primes[11] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

    ll value = traditional_kanp_sack(sack, primes, N, W);

    cout << value << "\n";

  }

    return 0;
}
