深度優先搜尋之生日蛋糕

2021-10-23 06:10:35 字數 1342 閱讀 8083

描述

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外,以上所有資料皆為正整數)

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

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

樣例輸入

100

2

樣例輸出

68
提示

圓柱公式

體積v = πr2h

側面積a' = 2πrh

底面積a = πr2

/**

* name: 生日蛋糕

* p_id: poj 1190

* date: 2016-04-13

*/#include #include #include using namespace std;

int n, m;

int best;

int leftmins[22], leftminv[22];

void dfs(int now, int sums, int sumv, int r, int h)

if(sums+leftmins[now]>best || sumv+leftminv[now]>n)

return;

/*** 2*r*h=s

* r*r*h=v

* => v*2/r = s

* s + sums >= best => return;

*/if((2*(n-sumv)/r + sums) >=best)

return;

for(int i=r-1; i>=now; i--)

}}int main()

scanf("%d", &n);

getchar();

scanf("%d", &m);

getchar();

best = 9999999;

dfs(m, 0, 0, 100, 10000);

if(best==9999999) best = 0;

printf("%d\n", best);

return 0;

}

生日蛋糕 搜尋剪枝

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

生日蛋糕(BFS)

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

F 生日蛋糕

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