def main(): import sys input = sys.stdin.read data = input().split() N = int(data[0]) V = int(data[1]) C = int(data[2]) items = [] idx = 3 for _ in range(N): v = int(data[idx]) w = int(data[idx + 1]) items.append((v, w)) idx += 2 INF = -10**18 DP = [ [INF] * (N + 2) for _ in range(V + 2) ] DP[0][0] = 0 # initial state for v_i, w_i in items: # 0-1 knapsack step: include the item once for j in range(V, v_i - 1, -1): for k in range(N, -1, -1): if DP[j - v_i][k] != INF: new_j = j new_k = k + 1 if new_k > N: continue new_sat = DP[j - v_i][k] + w_i + C if new_sat > DP[new_j][new_k]: DP[new_j][new_k] = new_sat # Unbounded knapsack step: include the item multiple times for j in range(V - v_i + 1): for k in range(N + 1): if DP[j][k] != INF: new_j = j + v_i if new_j > V: continue new_sat = DP[j][k] + w_i if new_sat > DP[new_j][k]: DP[new_j][k] = new_sat max_sat = 0 for j in range(V + 1): for k in range(N + 1): if DP[j][k] > max_sat: max_sat = DP[j][k] print(max_sat) if __name__ == "__main__": main()