POJ1190 生日蛋糕 DFS剪枝

2021-10-10 11:12:23 字數 3048 閱讀 5067

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

設從下往上數第 i(1

≤i≤m

)i(1\leq i \leq m)

i(1≤i≤

m)層蛋糕是半徑為 ri , 高度為 hi 的圓柱。當 i

<

mi < m

i<

m 時,要求 r

i>ri

+1

r~i~ > r~i+1~

ri>ri

+1且 h

i>hi

+1

h~i~ > h~i+1~

hi>hi

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

令q = sπ

請程式設計對給出的n和m,找出蛋糕的製作方案(適當的ri和hi的值),使s最小。(除q外,以上所有資料皆為正整數)

演算法標籤:dfs

採用自底向上的搜尋。由題可知,所有數均為正整數,所以所有計算無需關心 π

\piπ 。

首先確定半徑r的最大值,高度h的最大值。

當高度均為1時,r最大。

當圓柱上表面面積均為1時,h最大。

因為所有資料均為正整數,所以可以求得第 i 層到第 1 層的最小體積和最小側面積,假設第一層半徑r為1。

即 : ::m

inv[

i]=m

inv[

i−1]

+i∗i

∗i

minv[i] = minv[i-1] + i*i*i

minv[i

]=mi

nv[i

−1]+

i∗i∗i(1

≤i≤m

)(1 \leq i \leq m)

(1≤i≤m)mi

ns[i

]=mi

ns[i

−1]+

2∗i∗

imins[i] = mins[i-1] + 2*i*i

mins[i

]=mi

ns[i

−1]+

2∗i∗i(1

≤i≤m

)(1 \leq i \leq m)

(1≤i≤m

)dfs種三個剪枝條件:

設剩餘面積 dv=

n−su

mv

dv = n - sumv

dv=n−s

umv ,

還需要的表面積 :

s = 2×

\times

×ri×

\times

×hi + 2×

\times

×ri-1

×

\times

×hi-1 + ⋯

\cdots

⋯ +2×

\times

×r1×

\times

×h1≥

\geq

≥ 2×

\times

×ri×

\times

×hi×

\times

×(ri/r) + 2×

\times

×ri-1

×

\times

×hi-1

×

\times

×(ri-1/r) + ⋯

\cdots

⋯ +2×

\times

×r1×

\times

×h1×

\times

×(r1/r) = 2*dv/r

( 1≤

i≤de

pth−

1)

(1 \leq i \leq depth-1)

(1≤i≤d

epth

−1)r 為當前半徑,可知 r >

>

>

// tsworld

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

// 初始化

const

long

long n =30;

const

int maxx =

0x3f3f3f3f

;// 定義

int n,m;

// 最小體積和最小面積

int minv[n]

,mins[n]

;// result

int ans;

void

dfs(

int depth,

int sumv,

int sums,

int r,

int h)

if(sumv + minv[depth-1]

> n)

return;if

(sums + mins[depth-1]

> ans)

return;if

(sums+2*

(n-sumv)

/r >= ans)

return

;// 因為r值最小為1,所以每一層最小值等於其所在層數

for(

int i = r-

1;i >= depth;i--)}

intmain()

// 因為求最小值,ans初始化為最大值

ans = maxx;

dfs(m,0,

0,r_best,h_best);if

(ans == maxx)

cout<<0;

else

cout

}

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