生日蛋糕问题
剪枝
program cake;
var
v,m,r,h,ans,i:longint;
mins,minv:array[0..30]of longint;
function min(i,j:longint):longint; begin if i>j then exit(j) else exit(i); end;
procedure search(floor,v_leave,s_used,last_r,last_h:longint);
var r,h,maxv:longint;
begin
if (floor=m+1) and (s_used<ans) and (v_leave=0) then ans:=s_used;
if floor>m then exit;
if s_used+2*sqr(m-floor+1)>ans then exit;
if ((2*v_leave)/r+s_used)>ans then exit;
if v_leave>((m-floor+1)*(sqr(r)*h)) then exit;
if v_leave<(m-floor+1) then exit;
if floor=m+1 then begin
if v_leave=0 then begin if s_used<ans then ans:=s_used; end;
exit;
end;
for r:=m-floor+1 to last_r-1 do
for h:=m-floor+1 to last_h-1 do
search(floor+1,v_leave-r*r*h,s_used+2*r*h,r,h);
end;
begin
assign(input,'cake.