import sys
from math import inf
n,v = map(int,input().split())
a = [list(map(int,input().split())) for _ in range(n)]
# dp[i][j]定义为装前i个物品在容量为j的情况下的最大价值
# dp[i][0]=0,dp[0][j]=0
# 核心转移关系
# if j < v[i-1]: # 当前容量小于第i个物品的体积
# dp[i][j] = dp[i-1][j]
# else:
# not_take = dp[i-1][j]
# take = dp[i-1][j-v[i-1]]+w[i-1]
# dp[i][j] = max(not_take,take)
# 不要求装满背包方案
dp1 = [[0]*(v+1) for _ in range(n+1)]
for i in range(1,n+1):
for j in range(1,v+1):
if j < a[i-1][0]:
dp1[i][j] = dp1[i-1][j]
else:
not_take = dp1[i-1][j]
take = dp1[i-1][j-a[i-1][0]]+a[i-1][1]
dp1[i][j] = max(not_take,take)
print(dp1[n][v])
# 要求恰好装满背包方案
# dp[i][j]定义为装前i个物品在恰好装满体积为j的背包时的最大价值
# dp[0][0]=0,dp[i][0]=0
# if j != v[i-1]:dp[i][j] = dp[i-1][j]
# else:dp[i][j] = dp[i-1][j-v[i-1]]+w[i-1]
dp2 = [[-inf]*(v+1) for _ in range(n+1)]
dp2[0][0]=0
for i in range(1,n+1):
dp2[i][0]=0
for j in range(1,v+1):
if j < a[i-1][0]:
dp2[i][j] = dp2[i-1][j]
else:
dp2[i][j] = max(dp2[i-1][j-a[i-1][0]]+a[i-1][1],dp2[i-1][j])
if dp2[n][v]==-inf:
print(0)
else:
print(dp2[n][v])