LIMIT = 1001001 INF = 10**18 N, W = [int(s) for s in input().split()] v_list, w_list = [0] * N, [0] * N for i in range(N): v_list[i], w_list[i] = [int(s) for s in input().split()] dp = [-INF] * LIMIT dp[0] = 0 for v, w in zip(v_list, w_list): for i in range(LIMIT): if i - w >= 0: dp[i] = max(dp[i - w] + v, dp[i]) max_idx = max(range(N), key=lambda i: v_list[i] / w_list[i]) v, w = v_list[max_idx], w_list[max_idx] ans = 0 for i in range(min(LIMIT, W + 1)): ans = max(dp[i] + v * ((W - i) // w), ans) print(ans)