題意:中文題。要製作乙個體積為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外,以上所有資料皆為正整數)
思路:主要第三個剪枝比較難想:設剩餘總體積為總體積減去蛋糕下面的層的總體積,剩餘總面積是當前已得最優解減去蛋糕當前層以下的層的總面積。設ri為每層的半徑,hi為每層的高度。蛋糕上面層的總面積是對2*ri*hi求和。總體積ri*ri*hi求和。剩餘總體積*2再除以當前層的半徑必須小於剩餘總面積,否則返回。(2×sigma(ri*ri*hi)/rk > sigma(2*ri*hi) i=1~k)之所以左邊大於右邊是因為rk>ri 對於i其中v陣列和a陣列是前i個蛋糕都取最小半徑和高時的最小可能體積和面積。
再有要注意的是兩層迴圈的方向,從小到大搜尋的話一定tle。
#include #include #include using namespace std;
#define n 20
int v[n+2],a[n+2];
int n,m,down,res=0x3fffffff;
void init(int d)
}int test(int d,int r,int vol,int are)
void dfs(int d,int r,int h,int vol,int are)
if(test(d,r,vol,are))
return;
for(i = r-1;i>=d;i--)
}int maxv(int r,int h,int d)
}int main()
dfs(m,n,0,sqrt((double)(n-minv[m-1])/m)+1,(n-minv[m-1])/(m*m)+1);
if(res == inf)
printf("0\n");
else
printf("%d\n",res);
}return 0;
}
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層生日蛋糕,每層都是乙個圓柱體。設從下往上數...
POJ 1190 生日蛋糕(DFS 剪枝)
本題是一道dfs 剪枝的經典例題,詳情請看 注釋,裡面按照我個人的理解進行了詳細的解釋 include include include include include include include include include include include using namespace st...