import sys def main(): N, K = map(int, sys.stdin.readline().split()) pizzas = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)] # Sort by price descending, then by deliciousness descending pizzas.sort(key=lambda x: (-x[0], -x[1])) # Initialize DP dp_prev = [[-1] * (N+2) for _ in range(K+1)] # K+1 x (N+1) dp_prev[0][0] = 0 # cost 0, 0 free, total deliciousness 0 for i in range(N): P, D = pizzas[i] dp_next = [row[:] for row in dp_prev] for k in range(K+1): for r in range(N+1): if dp_prev[k][r] == -1: continue # Option 1: Buy the pizza if k + P <= K: new_k = k + P new_r = r + 1 if new_r > N: continue if dp_next[new_k][new_r] < dp_prev[k][r] + D: dp_next[new_k][new_r] = dp_prev[k][r] + D # Option 2: Take free if possible (r > 0) if r > 0: new_k = k new_r = r - 1 if dp_next[new_k][new_r] < dp_prev[k][r] + D: dp_next[new_k][new_r] = dp_prev[k][r] + D dp_prev = dp_next # Find the maximum deliciousness across all possible k and r max_del = 0 for k in range(K+1): for r in range(N+1): if dp_prev[k][r] > max_del: max_del = dp_prev[k][r] print(max_del) if __name__ == "__main__": main()