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])