生日蛋糕問題 【最簡潔代碼】

生日蛋糕問題

   

 

剪枝

 

 

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.



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章