import numpy as np

N, W = list(map(int, input().split()))

ndp = np.zeros(W+1, dtype= np.int64)

for _ in range(N):

    w, v = list(map(int,input().split()))



    # 離散より連続で扱った方が簡単になる。

    np.maximum(ndp[:-w] + v, ndp[w:], out = ndp[w:])

print((ndp[-1]))





"""

https://atcoder.jp/contests/dp/submissions/6657472

より失敬。



めっちゃスマートな解法。

"""

import numpy as np

N,W = list(map(int,input().split()))

ndp = np.zeros(W+1,dtype= np.int64)

for _ in range(N):

    w,v = list(map(int,input().split()))

    np.maximum(ndp[:-w] + v, ndp[w:], out = ndp[w:])

print((ndp[-1]))

import numpy as np

N, W = list(map(int, input().split()))
ndp = np.zeros(W + 1, dtype=np.int64)
for _ in range(N):
    w, v = list(map(int, input().split()))
    # 離散より連続で扱った方が簡単になる。
    np.maximum(ndp[:-w] + v, ndp[w:], out=ndp[w:])
print((ndp[-1]))
"""
https://atcoder.jp/contests/dp/submissions/6657472
より失敬。
めっちゃスマートな解法。
"""

import numpy as np

N, W = list(map(int, input().split()))
ndp = np.zeros(W + 1, dtype=np.int64)
for _ in range(N):
    w, v = list(map(int, input().split()))
    np.maximum(ndp[:-w] + v, ndp[w:], out=ndp[w:])
print((ndp[-1]))

-    # 離散より連続で扱った方が簡単になる。 -""" -https://atcoder.jp/contests/dp/submissions/6657472 -より失敬。 -めっちゃスマートな解法。 -"""