# Дано N предметов. Каждый из них имеет вес w i и стоимость p i .
# Также имеется рюкзак вместимостью W. От вас требуется найти такой набор предметов,
# что их суммарная стоимость максимальна, а суммарный вес не превосходит вместимость рюкзака.
# Ответом на задау надо будет вывести стоимость такого набора.
# Формат входных данных
# На первых двух строках даны натуральные числа N и W, не превосходящие 100.
# На следующих 2*M строках даны пары чисел натуральных w i ≤ 100 и p i ≤ 1000.
# Формат выходных данных
# Одно число - стоимость набора.

N = int(input())  # Количество предметов
Weight_limit = int(input())  # Вместимость рюкзака

weights = [0]  # Фактические значения будут храниться, начиная с элемента с индексом 1.
prices = [0]

for _ in range(N):
    weights.append(int(input()))
    prices.append(int(input()))

F = [[0] * (N + 1) for _ in range(Weight_limit + 1)]
# Строки соответствуют массе, столбцы - количеству предметов.

for i in range(1, N + 1):
    for k in range(1, Weight_limit + 1):
        if weights[i] <= k:  # Если вес i-го предмета не превышает текущее значение k (порядковый номер строки),
            F[k][i] = max(F[k][i-1], prices[i] + F[k - weights[i]][i-1])
            # вносим в текущую ячейку максимум из:
            # 1) предыдущее значение стоимости в той же строке (стоимость набора без нового предмета)
            # 2) стомость i-го предмета плюс стоимость для веса "k - вес текущего предмета".
        else:  # Если вес i-го предмета превышает текущее значение k (порядковый номер строки),
            F[k][i] = F[k][i - 1]  # не добавляем его, вносим в ячейку стоимость без этого предмета.

print(F[Weight_limit][N])
