描述: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
#include
#include
#include
using
namespace
std;
int n,m; //體積為n,層數為m
int mins = 1
<< 30; //最小外表面積
int s; //當前外表面積
int temps[21]=; //製作i層的最小表面積
int tempminv[21]=; //製作i層的最小體積
int tempmaxv; //製作i層的最大體積(需要根據上一層的半徑和高計算,不能初始化)
void dfs(int v, int n, int r, int h)
} if(v <= 0) //因為n是每次-1,所以不用判斷小於0的狀態
return ;
//最優性剪枝
//之後的面積一定不會更小
if(s + temps[n] >= mins)
return ;
//可行性剪枝
if(tempminv[n] > v)
return ;
//迴圈所有的能到達的結點,也就是狀態
for(int rr = r; rr >= n; rr--) //因為還有n層,所以這裡半徑最小只能是n
if(v-rr*rr*hh > tempmaxv)
continue;
s += 2*rr*hh;
dfs(v-rr*rr*hh,n-1,rr-1,hh-1);
s -= 2*rr*hh;
} }
}int main()
//最大體積只能知道上一層的半徑和高才能算
} dfs(n,m,100,10000);
if(mins == 1
<< 30)
printf("0");
else
printf("%d",mins);
return
0;
}
poj 1190 生日蛋糕(剪枝 深搜)
題目位址 題目大意 n 體積m層的蛋糕,使得表面積最小 解題思路 將蛋糕從上到下編號1.m,從m層開始搜尋,搜尋過程中注意剪枝 三個剪枝條件 1 已經搜尋過的體積加上還未搜尋過的最小體積不能比總體積n 大 2 已經搜尋過的表面積加上還未搜尋過的最小表面積不能比之前的最小總表面積best 大 3 n ...
POJ1190 生日蛋糕 深搜
生日蛋糕 time limit 1000ms memory limit 10000k total submissions 18992 accepted 6769 description 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數...
POJ 1190 生日蛋糕(深搜 神奇的剪枝)
7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當iri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 的面積q最小。令q...