# 数量,容量 n, c = map(int, input().split()) # W = [0] # V = [0] # for _ in range(n): # w, v = map(int, input().split()) # while w <= c: # W.append(w) # V.append(v) # w += w # v += v # nn = len(W) # dp = [0] * (c + 1) # # for i in range(1, nn ): # for j in range(c, W[i] - 1, -1): # dp[j] = max(dp[j], dp[j - W[i]] + V[i]) # print(dp[-1])
W = [0] V = [0] for _ inrange(n): w, v = map(int, input().split()) W.append(w) V.append(v) dp = [0] * (c + 1)
for i inrange(1, n): w = W[i] for j inrange(c, w - 1, -1): k = 1 while w * k <= j: dp[j] = max(dp[j], dp[j - w * k] + k * V[i]) k += 1 print(dp[-1])
# 数量,容量 n, c = map(int, input().split()) W = [0] V = [0] for _ inrange(n): w, v = map(int, input().split()) W.append(w) V.append(v) dp = [[0] * (c + 1) for _ inrange(n + 1)]
for i inrange(1, n + 1): for j inrange(1, c + 1): if i == 1: dp[i][j] = 0 else: dp[i][j] = dp[i - 1][j] for k inrange(0, j // W[i] + 1): dp[i][j] = max(dp[i][j], dp[i - 1][j - W[i] * k] + k * V[i])
N, V = map(int, input().split()) dp = [0] * (V + 1) for _ inrange(N): w, v = map(int, input().split()) for j inrange(w, V + 1): dp[j] = max(dp[j], dp[j - w] + v) print(dp[-1])