program mire;
type vec=record
gr,p:longint;
end;
var f,g:text;
n,gre,max:longint;
v:array[0..5000] of vec;
pre,suc:array[-1..100001] of longint;
procedure citire;
var i:longint;
begin
assign(f,'rucsac.in'); reset(f);
assign(g,'rucsac.out'); rewrite(g);
readln(f,n,gre);
for i:=1 to n do
read(f,v[i].gr,v[i].p);
close(f);
end;
procedure dinamica;
var i,j:longint;
begin
max:=0;
for i:=1 to n do
begin
for j:=1 to gre do
begin
if v[i].gr<=j then
if v[i].p+pre[j-v[i].gr]>pre[j] then
suc[j]:=v[i].p+pre[j-v[i].gr]
else
suc[j]:=pre[j];
if suc[j]>max then
max:=suc[j];
end;
pre:=suc;
end;
writeln(g,max);
close(g);
end;
begin
citire;
dinamica;
end.