原始思路(黑色)
正解(highlighter)
從幾個角度考慮
優化搜尋順序:
本題本來就有順序
對,的確要從下往上
排除等效冗餘:無無
可行性剪枝:
若往上放的蛋糕體積盡可能大也不符合要求直接return
除此之外還要注意:
1.若放上的體積最小也超出return 2.h和r的取值範圍要大於從上往下數的層數(否則後面無法安排)3. h和r要小於上一層且小於sqrt(n-v),v是已經擺出的體積.
最優性剪枝:
若目前的表面積超出已求得最優return
更好的是
1.當前加上剩下層數可組成最小表面積大於最優return
2.v=h×r×r,s_側=2×r×h,所以2(n-v)/r[x]+s小於接下來的面積(r一層比一層小)所以這個值若大於已找到的最小表面積return
記憶化:無無
**(剪枝相關處加了斜線或注釋)
#include
#include
#include
using
namespace std;
int n,m;
int v[20]
,s[20];
int h[20]
,r[20];
int ans=
0x7f7f7f7f
;void
dfs(
int x,
int vn,
int sn)
if(vn+h[x+1]
*r[x+1]
*r[x+1]
*xreturn;//
for(
int i=
min(r[x+1]
-1,(
int)
sqrt
(float
(n-vn)))
;i>=x;
--i)
//for迴圈從大到小是為了少算幾次min(),增快速度,很重要}}
intmain()
r[m+1]
=100
; h[m+1]
=100
;dfs
(m,0,0
);if(ans==
0x7f7f7f7f
)printf
("0\n");
else
printf
("%d\n"
,ans)
;return0;
}
POJ 1190 生日蛋糕
生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...
POJ 1190 生日蛋糕
呵呵,這道題弄死我。我覺得吧,凡事不能急於求成,比如這道經典的剪枝 搜尋,我就先查的題解,看了各種剪枝方法躊躇滿志,結果花了兩個小時寫的剪枝把自己都搞暈了。應該先有正確的搜尋方法再談剪枝不是嗎,所以我決定先用樸素的搜尋做一下 include includeint n,m int temp s 999...
POJ 1190 生日蛋糕
time limit 1000ms memory limit 10000k total submissions 17060 accepted 6074 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為r...