Language: C++

#include <bits/stdc++.h>
using namespace std;
#define pi 2*asin(1.0)
#define MAX 10000000
#define MOD 1000000007
 
 
vector<long> fac(MAX);
vector<long> finv(MAX);
vector<long> inv(MAX);
 
//template functions
/////////////////////////
void Cominit(){
  fac.at(0)=fac.at(1)=1;
  finv.at(0)=finv.at(1)=1;
  inv.at(1)=1;
  for(long i=2;i<MAX;i++){
      fac.at(i)=(fac.at(i-1)*i)%MOD;
      inv.at(i)=MOD-inv.at(MOD%i)*(MOD/i)%MOD;
      finv.at(i)=finv.at(i-1)*inv.at(i)%MOD;
  }
}

long facComb(long N,long M){// nCm%
if(N<M) return 0;
if(N<0||M<0) return 0;
return fac.at(N)*(finv.at(M)*finv.at(N-M)%MOD)%MOD;
}

long Comb(long N,long M){// nCm
long ans=1;
for(long i=N;i>N-M;i--){
    ans=ans*i;
}
for(long i=M;i>0;i--){
    ans=ans/i;
}
return ans;
}

long Perm(long N,long M){// nPm
long ans=1;
for(long i=N;i>N-M;i--){
    ans=ans*i;
}
return ans;
}

long GCM(long A,long B){
            long W,r;
    if(A<B){

        W=B;
        B=A;
        A=W;
    }
    while(A%B!=0){
        r=A%B;
        A=B;
        B=r;
    }
    return B;
}
long LCM(long A,long B){
    return (A*B)/GCM(A,B);
}

long upDiv(long a,long b){
  return (a+b-1)/b;
}
long maxC(long a,long b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}

/////////////////////////


//Answer


int main() {

typedef pair<long,long> P;
long N,T,ans;
cin>>N>>T;
vector<long> A(N);
vector<long> B(N);
vector<vector<P>> dp(N+1,vector<P>(T+1));
for(long i=0;i<N;i++){
cin>>A.at(i);
cin>>B.at(i);
}
for(long i=0;i<N+1;i++){
    for(long j=0;j<T+1;j++){
        dp.at(i).at(j).first=0;
        dp.at(i).at(j).second=0;
    }
}
for(long i=0;i<N;i++){//dp.at(i+1).at(j) i番目までから時間をj以下にするようにして選ぶ
    for(long j=0;j<T+1;j++){
        if(j<A.at(i)){
            dp.at(i+1).at(j).first=dp.at(i).at(j).first;
            dp.at(i+1).at(j).second=maxC(dp.at(i).at(j).second,B.at(i));
        }else{
            if(dp.at(i).at(j).first>dp.at(i).at(j-A.at(i)).first+B.at(i)){
                dp.at(i+1).at(j).first=dp.at(i).at(j).first;
                dp.at(i+1).at(j).second=maxC(dp.at(i).at(j).second,B.at(i));
            }else if(dp.at(i).at(j).first<dp.at(i).at(j-A.at(i)).first+B.at(i)){
                dp.at(i+1).at(j).first=dp.at(i).at(j-A.at(i)).first+B.at(i);
                dp.at(i+1).at(j).second=dp.at(i).at(j-A.at(i)).second;                
            }else{
                dp.at(i+1).at(j).first=dp.at(i).at(j-A.at(i)).first+B.at(i);
                dp.at(i+1).at(j).second=maxC(dp.at(i).at(j-A.at(i)).second,maxC(dp.at(i).at(j).second,B.at(i)));                
            }

        }
    }
}
ans=dp.at(N).at(T).first;
for(long i=1;i<T+1;i++){
  if(ans<dp.at(N).at(T-i).first+dp.at(N).at(T-i).second){
    ans=dp.at(N).at(T-i).first+dp.at(N).at(T-i).second;
}
cout<<ans<<endl;




}







/*高精度要求→しつこくlong doubleでcast　出力はprintf("20.20Lf")とかで

出力の精度を上げるには、cout<< fixed << setprecision(10) << answer<<endl;

//printf("%a.bLf")のとき、a-b-1が整数部分の桁数。
配列系の書き方
long N;
cin>>N;
vector<long> p(N);
for(long i=0;i<N;i++){
cin>>p.at(i);
}

vector<int> d(102,1);

sort(A.begin(),A.end());
reverse(A.begin(),A.end());

typedef pair<long,long> P;
vector<P> p(N);
vector<vector<vector<long>>> dp(N+1,vector<vector<long>>(W+1,vector<long>(K+1)));
vector<vector<long>> A(N,vector<long>(M));

int a='A'+2;
cout<<a<<endl;　//a=67 文字は整数型に代入して文字コード化できる。

  char c=65;
cout<<c<<endl;  //c='A' 整数は文字型に代入してその整数が文字コードとしてあらわす整数にできる。

*/

Compiler output:
a.cc: In function 'int main()':
a.cc:134:2: error: expected '}' at end of input
  134 | }
      |  ^
a.cc:86:12: note: to match this '{'
   86 | int main() {
      |            ^