/*
* Problem :: 14728 / 벼락치기
*
* Kind :: Dynamic Programming
*
* Insight
* - 그냥 전형적인 DP 문제
* + 옛날 처음 풀었을 때 어려워서 체크했나보다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <cstring>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, T;
cin >> N >> T;
int K[N+1], S[N+1];
for (int i=1; i<=N; i++)
cin >> K[i] >> S[i];
// Process
int dp[N+1][T+1]; /* dp[i][j] = j 시간동안 1~i 단원을 공부해서 얻을 수 있는 최대 점수 */
memset(dp, 0, sizeof(dp));
for (int i=1; i<=N; i++) {
for (int j=1; j<=T; j++) {
dp[i][j] = dp[i-1][j];
if (j-K[i] >= 0) {
dp[i][j] = max(dp[i][j], dp[i-1][j-K[i]]+S[i]);
}
}
}
// Control : Output
cout << dp[N][T] << endl;
}
// Helper Functions
/* None */