您的位置:首页 > 其它

pku1190 生日蛋糕

2012-03-14 16:30 176 查看
这道题是一道经典的搜索剪枝题,每次听搜索的课总有这道题,剪枝思想主要就是最优化和可行性。

最优化:当前面积+下面的最小面积>当前解

可行性:1:当前剩余体积<做完剩余蛋糕需要的最小体积

2:当前剩余体积+做剩余蛋糕能用的最大体积<N

View Code

program pku1190(input,output);
const
maxr    = 30;
maxh    = 30;
var
n,m,answer : longint;
minv          : array[0..21] of int64;
mins          : array[0..21] of int64;
procedure init;
begin
readln(n);
readln(m);
end; { init }
procedure dfs(now,v,ri,hi,s :longint );
var
i,r,h,ss,maxv : longint;
begin
if v<minv[now] then
exit;
if s+mins[now]>=answer then
exit;
maxv:=0;
for i:=1 to now do
inc(maxv,(ri-i)*(ri-i)*(hi-i));
if maxv<v then
exit;
if now=0 then
begin
ss:=s+ri*ri;
if ss<answer then
answer:=ss;
exit;
end;
for r:=ri-1 downto now do
for h:=hi-1 downto now do
dfs(now-1,v-r*r*h,r,h,s+ri*ri-r*r+2*r*h);
end; { dfs }
procedure main;
var
i,r,h : longint;
begin
answer:=19950714;
mins[0]:=1;
minv[0]:=0;
for i:=1 to m do
begin
minv[i]:=minv[i-1]+i*i*i;
mins[i]:=mins[i-1]+2*i*i+2*i-1;
end;
for r:=maxh downto m do
for h:=maxh downto m do
dfs(m-1,n-r*r*h,r,h,2*r*h);
end; { main }
procedure print;
begin
if answer=19950714 then
writeln(0)
else
writeln(answer);
end; { print }
begin
init;
main;
print;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: