生日蛋糕問題
剪枝
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.in'); assign(output,'cake.out');
reset(input); rewrite(output);
readln(v,m); ans:=maxlongint;
mins[0]:=0;
minv[0]:=0;
for i:=1 to m do begin
mins[i]:=2*i*i+mins[i-1]+2*i-1;
minv[i]:=minv[i-1]+i*i*i;
end;
for r:=1 to 30 do
for h:=30 downto 1 do
search(2,v-r*r*h,r*r+2*r*h,r,h);
writeln(ans);
close(input); close(output);
end.