N,V=map(int,input().split())
w=[0]
v=[0]
for i in range(N):
a,b=map(int,input().split())
v.append(a)
w.append(b)
dp=[[0]*(V+1) for i in range(N+1)]
for i in range(N+1):
for j in range(V+1):
if v[i]>j:
dp[i][j]=dp[i-1][j]
else:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])
print(dp[-1][-1])
#滚动数组之交替滚动
N,V=map(int,input().split())
w=[0]
v=[0]
for i in range(N):
a,b=map(int,input().split())
v.append(a)
w.append(b)
dp=[[0]*(V+1) for i in range(2)]
old=1
now=0
for i in range(N+1):
old,now=now,old
for j in range(V+1):
if v[i]>j:
dp[now][j]=dp[old][j]
else:
dp[now][j]=max(dp[old][j],dp[old][j-v[i]]+w[i])
print(dp[now][-1])
#滚动数组之自我滚动
N,V=map(int,input().split())
w=[0]
v=[0]
for i in range(N):
a,b=map(int,input().split())
v.append(a)
w.append(b)
dp=[0]*(V+1)
for i in range(N+1):
for j in range(V,v[i]-1,-1):
dp[j]=max(dp[j],dp[j-v[i]]+w[i])
print(dp[-1])