using System;
using System.Collections.Generic;
using System.Text;

namespace AtTest.D_Challenge
{
    class ABC_060
    {
        static void Main(string[] args)
        {
            Method(args);
            Console.ReadLine();
        }

        static void Method(string[] args)
        {
            long[] nw = ReadLongs();
            var wv = new long[nw[0]][];
            long w1 = 0;
            for (int i = 0; i < nw[0]; i++)
            {
                wv[i] = ReadLongs();
            }
            var dict = new Dictionary<long, long>();
            dict.Add(0, 0);
            for(int i = 0; i < nw[0]; i++)
            {
                var tempDict = new Dictionary<long, long>();
                foreach(long key in dict.Keys)
                {
                    long w = key + wv[i][0];
                    long v = dict[key] + wv[i][1];
                    if (w <= nw[1])
                    {
                        tempDict.Add(w, v);
                    }
                }
                foreach(long key in tempDict.Keys)
                {
                    if (dict.ContainsKey(key))
                    {
                        if (dict[key] < tempDict[key])
                        {
                            dict[key] = tempDict[key];
                        }
                    }
                    else
                    {
                        dict.Add(key, tempDict[key]);
                    }
                }
            }

            long res = 0;
            foreach(long key in dict.Keys)
            {
                res = Math.Max(res, dict[key]);
                //Console.WriteLine(key + " " + dict[key]);
            }
            Console.WriteLine(res);

            /*
            dp[0, 0] = new long[2];
            if (wv[0][0] <= nw[1])
            {
                dp[0, 0][0] = wv[0][1];
                dp[0, 0][1] = wv[0][0];
            }
            else
            {
                dp[0, 0][0] = 0;
                dp[0, 0][1] = 0;
            }
            for(int i = 1; i < nw[0]; i++)
            {
                dp[0, i] = dp[0, i - 1];
            }
            for(int i = 1; i < nw[0]; i++)
            {
                for(int j = 0; j < nw[0]; j++)
                {
                    dp[i, j] = new long[2];
                    if (j == 0)
                    {
                        if (wv[i][0] <= nw[1] && wv[i][1] > dp[i - 1, 0][0])
                        {
                            dp[i, j][0] = wv[i][1];
                            dp[i, j][1] = wv[i][0];
                        }
                        else
                        {
                            dp[i, j][0] = dp[i - 1, j][0];
                            dp[i, j][1] = dp[i - 1, j][1];
                        }
                    }
                    else
                    {
                        long w, v;
                        if (dp[i - 1, j][0] < dp[i, j - 1][0])
                        {
                            w = dp[i, j - 1][1];
                            v = dp[i, j - 1][0];
                        }
                        else
                        {
                            w = dp[i - 1, j][1];
                            v = dp[i - 1, j][0];
                        }
                        long ww = dp[i - 1, j - 1][1] + wv[i][0];
                        long vv = dp[i - 1, j - 1][0] + wv[i][1];
                        if (ww <= nw[1]
                            &&vv>v)
                        {
                            v = vv;
                            w = ww;
                        }
                        dp[i, j][0] = v;
                        dp[i, j][1] = w;
                    }
                }
            }

            for(int i = 0; i < nw[0]; i++)
            {
                for(int j = 0; j < nw[0]; j++)
                {
                    Console.Write(dp[i, j][0] + " ");
                }
                Console.WriteLine();
            }
            */
        }

        private static string Read() { return Console.ReadLine(); }
        private static int ReadInt() { return int.Parse(Read()); }
        private static long ReadLong() { return long.Parse(Read()); }
        private static double ReadDouble() { return double.Parse(Read()); }
        private static int[] ReadInts() { return Array.ConvertAll(Read().Split(), int.Parse); }
        private static long[] ReadLongs() { return Array.ConvertAll(Read().Split(), long.Parse); }
        private static double[] ReadDoubles() { return Array.ConvertAll(Read().Split(), double.Parse); }
    }
}

Measured memory_bytes: 20064