n, M = map(int, input().split()) A = list(map(int, input().split())) A.sort(reverse=True) # Generate pairs of adjacent elements and their values pairs = [] for i in range(len(A) - 1): pairs.append((A[i] - A[i+1], A[i])) max_k = len(pairs) max_possible_k = min(max_k, n // 2) # Initialize DP table dp = [[-1] * (M + 1) for _ in range(max_possible_k + 1)] dp[0][0] = 0 for (d, v) in pairs: # Update DP in reverse to avoid overwriting current state for j in range(max_possible_k, 0, -1): for m in range(M, d - 1, -1): if dp[j-1][m - d] != -1: if dp[j][m] < dp[j-1][m - d] + v: dp[j][m] = dp[j-1][m - d] + v # Find the maximum possible O max_O = 0 for k in range(0, max_possible_k + 1): for m in range(0, M + 1): if dp[k][m] != -1: max_O = max(max_O, dp[k][m]) print(max_O)