#pragma warning disable

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Numerics;
using System.Collections;

static class MainClass
{
    public static void Main(string[] args)
    {

       

        checked
        {
            var NW = Console.ReadLine().SplittedStringToInt32List();
            var N = NW[0];
            var W = NW[1];

            var w1 = 0;
            var ls = new List<KeyValuePair<int, int>>(); // key is weigth (regurated)
            for (int i = 0; i < N; i++)
            {
                var wv = Console.ReadLine().SplittedStringToInt32List();


                var w =wv[0];
                var v = wv [ 1];

                if (i == 0)
                {
                    w1 = w;
                }
                ls.Add(new KeyValuePair<int, int>(w - w1, v));
            }
            var dp = new int[N + 1, 3 * N + 1, N + 2]; // dp:=i個目まで選んだときに重さがregurated j、k選んだときの価値

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < 3 * N + 1; j++)
                {
                    for (int k = 0; k <= N + 1; k++)
                    {
                        if (k - 1 >= 0 && j - ls[i].Key >= 0)
                            dp[i + 1, j, k] = Math.Max(dp[i, j, k], dp[i, j - ls[i].Key, k - 1] + ls[i].Value);
                        else
                            dp[i + 1, j, k] = dp[i, j, k];
                    }
                }
            }
            var num = -1;
            for (int i = 0; i < 3 * N + 1; i++)
            {
                for (int j = 0; j <= N + 1; j++)
                {
                    BigInteger weigth = (long)w1 * j + i;
                    if (weigth <= W)
                    {
                        num = Math.Max(num, dp[N, i, j]);
                    }
                }
            }
            Console.WriteLine(num);

            Console.ReadLine();
        }

        
    }
    

    #region ライブラリ
    public static long ToInt64(this string str) => long.Parse(str);
    public static int ToInt32(this string str) => int.Parse(str);
    public static BigInteger ToBigInteger(this string str) => BigInteger.Parse(str);
    public static List<string> SplittedStringToList(this string str) => str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
    public static List<int> SplittedStringToInt32List(this string str) => str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToList();
    public static List<long> SplittedStringToInt64List(this string str) => str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => long.Parse(x)).ToList();
    public static List<BigInteger> SplittedStringToBigInteger(this string str) => str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => BigInteger.Parse(x)).ToList();
    public const int INF = int.MaxValue / 2;
    public const long LONGINF = long.MaxValue / 2;

  
  

    public static void PrintArray(int[,] array)
    {
        for (int i = 0; i < array.GetLength(0); i++)
        {
            var sb = new StringBuilder();
            for (int j = 0; j < array.GetLength(1); j++)
            {
                sb.Append(array[i, j]).Append(" ");
            }
            Console.WriteLine(sb.ToString());
        }
    }

    #endregion
}



Measured memory_bytes: 25184