poj1190 生日蛋糕

2021-10-02 17:26:35 字數 1270 閱讀 5956

原始思路(黑色)

正解(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...