## https://yukicoder.me/problems/no/3401 from functools import cmp_to_key def compare_items(a, b): if a[1] * b[0] > a[0] * b[1]: return 1 elif a[1] * b[0] < a[0] * b[1]: return -1 else: return 0 def main(): N, W = map(int, input().split()) vw = [] max_w = 0 for _ in range(N): v, w = map(int, input().split()) vw.append((v, w)) max_w = max(max_w, w) k = (max_w + 1) ** 2 if k < W: dp = [0] * (max_w + 1) dp[0] = 0 for k in range(max_w + 1): if dp[k] == -1: continue for v, w in vw: if k + w <= max_w: dp[k + w] = max(dp[k + w], dp[k] + v) # カスタム比較関数を使ってリストをソート sorted_vw = sorted(vw, key=cmp_to_key(compare_items)) v0, w0 = sorted_vw[0] answer = -1 for k in range(max_w + 1): if dp[k] == -1: continue x = W - k if x < 0: continue y = x // w0 ans = dp[k] + y * v0 answer = max(ans, answer) print(answer) else: dp = [-1] * (W + 1) dp[0] = 0 answer = 0 for k in range(W + 1): if dp[k] == -1: continue answer = max(answer, dp[k]) for v, w in vw: if k + w <= W: dp[k + w] = max(dp[k + w], dp[k] + v) print(answer) if __name__ == '__main__': main()