POJ1190生日蛋糕 DFS 剪枝

2021-09-07 07:27:50 字數 1495 閱讀 9215

生日蛋糕

time limit:1000ms

memory limit:10000k

total submissions:18236

accepted:6497

description

7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層生日蛋糕,每層都是乙個圓柱體。 

設從下往上數第i(1 <= i <= m)層蛋糕是半徑為ri, 高度為hi的圓柱。當i < m時,要求ri > ri+1且hi > hi+1。 

由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面(最下一層的下底面除外)的面積q最小。 

令q = sπ 

請程式設計對給出的n和m,找出蛋糕的製作方案(適當的ri和hi的值),使s最小。 

(除q外,以上所有資料皆為正整數) 

input

有兩行,第一行為n(n <= 10000),表示待製作的蛋糕的體積為nπ;第二行為m(m <= 20),表示蛋糕的層數為m。

output

僅一行,是乙個正整數s(若無解則s = 0)。

sample input

100

2

sample output

68
hint

圓柱公式 

體積v = πr

2h 側面積a' = 2πrh 

底面積a = πr

2 source

noi 99

一開始想的是從上往下搜,可以用a*的估價函式剪枝(因為下面的r和h都比上面的大)

然而題解都是遞推了mnv和mns然後用他們從下往上搜

比較神的乙個剪枝是2*(n-v)/lr+s>ans

2*(n-v)/lr這塊是剩下的體積所能圍成圖形面積下限,因為推導一下可知圓柱v不變,側面積與r成反比

還有h的範圍,mxh=min(lh-1,(n-mnv[d-1]-v)/(tr*tr));

#include #include 

#include

#include

#include

using

namespace

std;

const

int n=20

;int n,m,ans=1e9;

intmnv[n],mns[n];

void

init()

}void dfs(int d,int lh,int lr,int s,int

v)

if(v+mnv[d]>n||s+mns[d]>ans) return

;

if(2*(n-v)/lr+s>ans) return

;

for(int tr=lr-1;tr>=d;tr--)

}}int

main()

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...