这是一道裸题
只不过,对pascal很不友善,交着T了,后来发现用了个maxx函数,常数大改了便AC
var
n,m,num,q,i,j:longint;
a,s1,w1,v1,bz,v,w,f:array[0..1000000] of longint;
{function maxx(a,b:longint):longint;
begin
if a>b then maxx:=a
else maxx:=b;
end; }
begin
read(n,m);
a[1]:=1;
for i:=2 to 30 do
a[i]:=a[i-1]*2;
for i:=1 to n do
begin
read(v1[i],w1[i],s1[i]);
if s1[i]=1 then
begin
inc(num);
bz[num]:=1;
v[num]:=v1[i];
w[num]:=w1[i];
end else
if s1[i]=-1 then
begin
inc(num);
bz[num]:=-1;
v[num]:=v1[i];
w[num]:=w1[i];
end else
begin
q:=s1[i];
for j:=1 to 30 do
if q-a[j]>0 then
begin
q:=q-a[j];
inc(num);
bz[num]:=1;
v[num]:=v1[i]*a[j];
w[num]:=w1[i]*a[j];
end else
begin
inc(num);
bz[num]:=1;
v[num]:=v1[i]*q;
w[num]:=w1[i]*q;
break;
end;
end;
end;
for i:=1 to num do
begin
if bz[i]=1 then
begin
for j:=m downto v[i] do
if f[j-v[i]]+w[i]>f[j] then
f[j]:=f[j-v[i]]+w[i];
end
else
for j:=v[i] to m do
if f[j-v[i]]+w[i]>f[j] then
f[j]:=f[j-v[i]]+w[i];
end;
writeln(f[m]);
end.