#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair pcc; typedef pair P; typedef tuple t3; #define rep(i,a) for(ll i = 0;i < a;i++) template void cmax(T& a, const T b){a=max(a,b);} const ll mod = 1e9+7; int main(void) { ll n,k; cin >> n >> k; vector

vs(n); rep(i,n){ cin >> vs[i].first >> vs[i].second; } sort(vs.begin(),vs.end(),[&](P a, P b){ if(a.first == b.first){ return a.second > b.second; } return a.first > b.first; }); vector>> dp(2, vector>(k+10, vector(2,0))); rep(i,n){ auto p = vs[i].first; auto d = vs[i].second; for(int j = 0;j <= k;j++){ cmax(dp[1][j][0],dp[0][j][0]); cmax(dp[1][j][1],dp[0][j][1]); if(dp[0][j][1] != 0){ cmax(dp[1][j][0],dp[0][j][1] + d); } } for(int j = 0;j+p <= k;j++){ cmax(dp[1][j+p][1], dp[0][j][0] + d); } swap(dp[0], dp[1]); } ll m = 0; rep(j,k+1){ cmax(m, dp[1][j][0]); cmax(m, dp[1][j][1]); } cout << m << endl; return 0; }