pku1190 生日蛋糕
2012-03-14 16:30
176 查看
这道题是一道经典的搜索剪枝题,每次听搜索的课总有这道题,剪枝思想主要就是最优化和可行性。
最优化:当前面积+下面的最小面积>当前解
可行性:1:当前剩余体积<做完剩余蛋糕需要的最小体积
2:当前剩余体积+做剩余蛋糕能用的最大体积<N
View Code
最优化:当前面积+下面的最小面积>当前解
可行性: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.
相关文章推荐
- PKU1190 生日蛋糕
- pku1190 生日蛋糕
- poj 1190 生日蛋糕 隐式图搜索
- POJ1190 生日蛋糕 ACM解题报告(DFS回溯+剪枝)
- POJ 1190 生日蛋糕
- poj 1190 生日蛋糕 , 强剪枝
- poj 1190 生日蛋糕
- POJ 1190 生日蛋糕
- POJ-1190 生日蛋糕 NOI99
- POJ 1190 生日蛋糕
- POJ 1190 生日蛋糕 (dfs + 神剪枝)
- POJ 1190 生日蛋糕(DFS+剪枝)
- 生日蛋糕 -POJ - 1190
- 解“POJ 1190 生日蛋糕”有感
- poj 1190 生日蛋糕
- POJ 1190 生日蛋糕__深搜
- POJ - 1190 生日蛋糕(深搜+神奇的剪枝)
- POJ 1190生日蛋糕(隐式BFS)
- POJ 1190 生日蛋糕 估计最小答案dfs剪枝
- poj 1190 生日蛋糕 dfs剪枝