// C++
//#include <bits/stdc++.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
cin.tie(NULL); ios::sync_with_stdio(false);
int n, k;
cin >> n >> k;
int weight, value;
vector<int> table(k + 1); // k번째 인덱스도 접근해야하기 때문에 k + 1
for (int i = 0; i < n; ++i) {
cin >> weight >> value;
// 입력받은 weight가 무게 제한보다 크면 불필요한 데이터이기 때문에 무시
if (weight > k) continue;
// 상향식 검사 시, 큰 인덱스에 접근하는 일이 생기기 때문에 하향식 검사
for (int j = k; j > 0; --j) {
// 기존에 value 값이 존재하면서 기존의 weight와 현재 weight의 합이 무게 제한보다 작거나 같을 때
if (table[j] != 0 && j + weight <= k)
// value가 더 큰 값으로 수정
table[j + weight] = table[j + weight] > table[j] + value ? table[j + weight] : table[j] + value;
}
// 현재 value값에 현재 value값을 비교하여 더 큰 값으로 수정
table[weight] = table[weight] > value ? table[weight] : value;
}
cout << *max_element(table.begin(), table.end());
return 0;
}