def main2(n,k,pd): pd.sort(key=lambda x:x[0],reverse=True) dp0={} dp1={} dp0[0]=0 for _,(p,d) in enumerate(pd): ndp0={} ndp1={} for i in dp0: # チケットなし if i+p<=k: if i+p in ndp1: ndp1[i+p]=max(ndp1[i+p],dp0[i]+d) else: ndp1[i+p]=dp0[i]+d if i in ndp0: ndp0[i]=max(ndp0[i],dp0[i]) else: ndp0[i]=dp0[i] for i in dp1: # チケットあり if i in ndp0: ndp0[i]=max(ndp0[i],dp1[i]+d) else: ndp0[i]=dp1[i]+d if i in ndp1: ndp1[i]=max(ndp1[i],dp1[i]) else: ndp1[i]=dp1[i] dp0=ndp0 dp1=ndp1 return max(max(dp0.values()),max(dp1.values())) if __name__=='__main__': n,k=map(int,input().split()) pd=[list(map(int,input().split())) for _ in range(n)] ret2=main2(n,k,pd) print(ret2)