POJ 生日蛋糕 DFS 剪枝

2021-09-23 10:43:45 字數 1192 閱讀 6552

題目鏈結

題目大意:乙個多層生日蛋糕。要求下面一層一定要比上面的一層大而且高,求符合該條件的蛋糕,其中最小的表面積; 

解題思路:

要求出最小表面積且下面的要比上面的大,所以每一層的半徑和高度最小值為該層的層數(從上到下數的層數),這樣一一枚舉每層的半徑和高度。但是由於情況太多,所以需要剪枝來降低搜尋的次數。

剪枝一:剩餘的蛋糕體積小於0;

剪枝二:高度和半徑小於最小值(也就是當前層數)---從上往下數;

剪枝三:剩餘體積不能夠滿足製作當前層蛋糕的需求(最小半徑和高度);

剪枝四:剩下蛋糕的體積,按照 製作前 求得每層 的最大體積,剩下的m層按照最大製作用不完蛋糕;

剪枝五:當前列舉求得的表面積已經大於之前求得的最小表面積;

圓柱公式 :

體積v = πhr^2

側面積s' = 2πrh 

底面積s = πr^2

#include #include #include using namespace std;

int mins[30],minv[30],area,minarea,n,m;

int maxf(int m,int r,int h)//求最大體積

}if(n<=0)//無剩餘體積

return ;

if(hn)//剩餘體積不滿足最小蛋糕需求

return ;

if(maxf(m,r,h) < n)//剩下m層按最大設計也用不完

return ;

if(mins[m]+area>=minarea)//當前層的理論最小面積+當前面積 已經大於 之前求得的最小面積時結束

return ;

for(int i=r;i>=m;i--)//i是半徑

for(int j=h;j>=m;j--)//j是高度

}}int main()

int maxr=sqrt((n-minv[m-1])/m) +1;

int maxh=(n-minv[m-1])/(m*m) +1;

///保證非負 在dfs裡會進行減一 不影響

minarea=99999999;

area=0;

dfs(n,m,maxr,maxh);

cout<}

return 0;

}

poj 1190 dfs 剪枝(生日蛋糕)

題意 中文題。要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 的面積q最小。令q s 請程式設...

poj 1190 生日蛋糕(DFS 剪枝)

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

POJ1190 生日蛋糕(DFS剪枝)

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