#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int dp[5005][5005][2], cum_max[5005][2]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, K; cin >> N >> K; vector> dat; for(int i = 0; i < N; ++i){ int P, D; cin >> P >> D; dat.emplace_back(P, D); } sort(rbegin(dat), rend(dat)); for(int i = 0; i <= N; ++i){ for(int s = 0; s <= K; ++s){ for(int f = 0; f < 2; ++f){ dp[i][s][f] = -INF; } } } for(int s = 0; s <= K; ++s){ for(int f = 0; f < 2; ++f){ cum_max[s][f] = -INF; } } dp[0][0][0] = 0; for(int i = 0; i < N; ++i){ for(int s = 0; s <= K; ++s){ for(int f = 0; f < 2; ++f){ chmax(cum_max[s][f], dp[i][s][f]); if(s) chmax(cum_max[s][f], cum_max[s - 1][f]); } } auto [P, D] = dat[i]; for(int s = 0; s <= K; ++s){ chmax(dp[i + 1][s][0], dp[i][s][0]); chmax(dp[i + 1][s][1], dp[i][s][1]); chmax(dp[i + 1][s][0], cum_max[s][1] + D); if(s + P <= K){ chmax(dp[i + 1][s + P][1], max(cum_max[s][0], cum_max[s][1]) + D); } } } int ans = -INF; for(int s = 0; s <= K; ++s){ for(int f = 0; f < 2; ++f){ chmax(ans, dp[N][s][f]); } } cout << ans << endl; return 0; }