此题为一般的动态规划,为可能性动态规划。初态只需将f[0]:=true;在所有都不小于a[i]的条件下进行动态规划。

状态转移方程:f[j+c[i]]:=true  (if (f[j]=true) and  (j+c[i]<=a[i]))

注意动态规划的顺序:一定要倒推,否则会造成重复。

CODE

Program Elevator;//By_Poetshy
Const
	maxn=40000;
Var
	i,j,p,n,max,re					:Longint;
	f								:Array[0..maxn]of Boolean;
	h,c,a							:Array[1..400]of Longint;
	
Function Min(i,j:Longint):Longint;
begin
	if i<j then exit(i);exit(j);
end;
	
Procedure Qsort(l,r:Longint);
var i,j,k,temp:Longint;
begin
	i:=l;j:=r;
	k:=a[(i+j)>>1];
	repeat
		while a[i]<k do inc(i);
		while a[j]>k do dec(j);
		if i<=j then
			begin
				temp:=a[i];a[i]:=a[j];a[j]:=temp;
				temp:=c[i];c[i]:=c[j];c[j]:=temp;
				temp:=h[i];h[i]:=h[j];h[j]:=temp;
				inc(i);dec(j);
			end;
	until i>j;
	if l<j then Qsort(l,j);
	if i<r then Qsort(i,r);
end;
	
BEGIN
	readln(n);f[0]:=true;max:=0;
	for i:=1 to n do readln(h[i],a[i],c[i]);
	Qsort(1,n);
	for i:=1 to n do
		for p:=1 to c[i] do
			begin
				re:=max;
				for j:=Min(max,a[i]-h[i])downto 0 do
					if f[j] then
						begin
							f[j+h[i]]:=true;
							if j+h[i]>max then max:=j+h[i];
						end;
				if re=max then break;
			end;
	writeln(max);
END.