Description
奶牛们想用K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度h_i(1<=h_i<=100)和数量c_i(1<=c_i<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度a_i(1<=a_i<=40000)。
帮助奶牛用石块堆积一个最高的太空电梯。
Input
第1行:一个整数K
第2到K+1行:每行3个用空格隔开的整数h_i,a_i,c_i
Output
输出一个高度H,表示最大高度。
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
Data Constraint
Hint
【样例说明】
从上到下依次是6个3号石块、3个1号石块和3个2号石块,注意放4个2号石块在3个1号石块的下面是不行的,因为1号石块最高不能超过40,而现在最上面的1号石块高度达到41,所以不行。
分析:
先把ai从小到大排序。
设f[i,j]为前i种石头,高度为j是否可行,显然是个判定性的dp,转移有点像背包,这里就不说了。
代码:
var
h,a,c:array [1..401] of longint;
f:array [0..40001] of boolean;
k,i,j,n,ans:longint;
procedure qsort(l,r:longint);
var
i,j,key,temp:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[l+random(r-l+1)];
repeat
while (a[i]<key) do inc(i);
while (a[j]>key) do dec(j);
if i<=j then
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
temp:=h[i];h[i]:=h[j];h[j]:=temp;
temp:=c[i];c[i]:=c[j];c[j]:=temp;
inc(i);dec(j);
end;
until i>j;
qsort(l,j);
qsort(i,r);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(h[i],a[i],c[i]);
end;
qsort(1,n);
f[0]:=true;
for i:=1 to n do
begin
for j:=a[i] downto 0 do
begin
for k:=1 to c[i] do
begin
if (j+k*h[i]>a[i]) then break;
f[k*h[i]+j]:=f[k*h[i]+j] or f[j];
end;
end;
end;
ans:=0;
for i:=a[n] downto 0 do
if f[i] then
begin
ans:=i;
break;
end;
writeln(ans);
end.