import Control.Monad
import Data.List

main = do
  li <- getLine
  let [n,w] = map read $ words li
  wvs <- forM [1..n] (\_ -> do
    li <- getLine
    let [w,v] = map read $ words li
    return (w,v)
    )
  let ans = compute w wvs
  print ans

{-
単純に総当たりで、前から順に入れたり入れなかったりしてみる
ただし袋が破れるなら入れない
とするなら、重いものを先に入れてみる方が枝刈りが起きやすいか？
-}

compute :: Int -> [(Int,Int)] -> Int
compute w wvs = maximum $ map snd $ loop [(0,0)] wvs1
  where
    wvs1 = reverse $ sort wvs
    loop awvs [] = awvs
    loop awvs ((wi,vi):wvs) = loop awvs' wvs
      where
        awvs' = [ (aw1, av+vi) | (aw,av) <- awvs, let aw1 = aw + wi, aw1 <= w ] ++ awvs
