POJ 1190 生日蛋糕(深搜 神奇的剪枝)

2022-01-10 07:38:39 字數 1828 閱讀 6039

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

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

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

令q= sπ

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

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

有兩行,第一行為n(n≤10000),表示待製作的蛋糕的體積為nπ;第二行為m(m≤20),表示蛋糕的層數為m。
僅一行,是乙個正整數s(若無解則s=0)。
示例1

100

2

68
附:圓柱公式體積v=πr2h側面積a』=2πrh底面積a=πr2
有點慚愧的是,我並沒有自己把它寫出來,實在是頭疼,以後有需要的時候還會自己寫一下。

這裡貼下dalao的**作為學習

#include #include #include #include #include using namespace std;

int n, m;

const int inf = 0x3f3f3f3f;

int minv[25], mins[25];

int ans;

void dfs(int r, int h, int layer, int v, int s)

if(n - v < minv[layer]) return;//剪枝1:總體積減去蛋糕當前層以下的層的總體積

//小於上面的層所能構成的最小體積

if(ans - s < mins[layer]) return;//剪枝2:當前得到的最優解減去蛋糕當前層以下的層的總面積

//小於上面的層所能構成的最小面積

if(s + 2 * (n - v) / r > ans) return;//剪枝3:2 * (n - v) / r 表示剩下的體積能組成最小面積

//的極限情況,可以證明,同樣的體積組成乙個大圓柱體和組成

//多個比乙個大圓柱體小的小圓柱體相比,前者的表面積比後者

//要小,所以這種表面積最小的情況再加上本層以下的確定的表

//面積s如果是大於已知最優解s,那麼最終結果一定不會比ans小

//返回 。(難理解)

int i, j;

for(i = r; i >= layer; i--) }}

int main()

while(~scanf("%d %d", &n, &m))

return 0;

}

關於剪枝的乙個小總結:

剪枝分為可行性剪枝最優化剪枝

可行性剪枝一般的思考過程就是,我一共需要多少,在最多的情況下也無法達到,或最少的情況下也會超過。

那麼至於最大與最小到底怎麼取到,就本題而言,還有類似的每層遞增的題目,可以考慮我從(1,1)開始每層加一,到現在的層數,面積和即為最小面積。而最大,就是把乙個變數限制成最小,就可以取得另乙個的最大,而對每乙個「另乙個」,都有乙個「這個」的最大與之對應。

最優化剪枝,就是考慮,我現有的面積和已經比最小面積大了,那麼不用繼續討論。或者,我現有的面積,加上最小面積,也比最小面積大,那麼也可以不再繼續。

POJ1190 生日蛋糕 深搜

生日蛋糕 time limit 1000ms memory limit 10000k total submissions 18992 accepted 6769 description 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數...

poj 1190 生日蛋糕(剪枝 深搜)

題目位址 題目大意 n 體積m層的蛋糕,使得表面積最小 解題思路 將蛋糕從上到下編號1.m,從m層開始搜尋,搜尋過程中注意剪枝 三個剪枝條件 1 已經搜尋過的體積加上還未搜尋過的最小體積不能比總體積n 大 2 已經搜尋過的表面積加上還未搜尋過的最小表面積不能比之前的最小總表面積best 大 3 n ...

POJ1190 生日蛋糕(深搜 剪枝)

描述 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面...