# ナップザック型dpでいいのか # dp[i個目までを見て][a_sum] s_sum max N, I = map(int, input().split()) SA = [()] for i in range(N): s, a = map(int, input().split()) SA.append((s, a)) #print(SA) dp = [[0]*(I+1) for i in range(N+1)] for i in range(1, N+1): s, a = SA[i] for j in range(I+1): # その塩ラーメンを使わない dp[i][j] = max(dp[i][j], dp[i-1][j]) # その塩ラーメンを使う if j+s <= I: dp[i][j+s] = max(dp[i][j+s], dp[i-1][j]+a) #print(dp[i]) ans = max(dp[N]) print(ans)