日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DFS--POJ 1190 生日蛋糕

發(fā)布時間:2023/12/15 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DFS--POJ 1190 生日蛋糕 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description
7月17日是Mr.W的生日,ACM-THU為此要制作一個體積為Nπ的M層生日蛋糕,每層都是一個圓柱體。
設(shè)從下往上數(shù)第i(1 <= i <= M)層蛋糕是半徑為Ri, 高度為Hi的圓柱。當(dāng)i < M時,要求Ri > Ri+1且Hi > Hi+1。
由于要在蛋糕上抹奶油,為盡可能節(jié)約經(jīng)費,我們希望蛋糕外表面(最下一層的下底面除外)的面積Q最小。
令Q = Sπ
請編程對給出的N和M,找出蛋糕的制作方案(適當(dāng)?shù)腞i和Hi的值),使S最小。
(除Q外,以上所有數(shù)據(jù)皆為正整數(shù))
Input
有兩行,第一行為N(N <= 10000),表示待制作的蛋糕的體積為Nπ;第二行為M(M <= 20),表示蛋糕的層數(shù)為M。
Output
僅一行,是一個正整數(shù)S(若無解則S = 0)。
Sample Input
100
2
Sample Output
68
Solution
由于深度一定(m),所以使用深度優(yōu)先搜索,自上而下的設(shè)定蛋糕序號,最頂層的為第1層,……,最底層的蛋糕為第m層,很明顯滿足題目條件的前i層的(從頂層(也就是編號為1的層)開始計數(shù))最小面積mins[i]和體積minv[i]是在該層的半徑以及高度都為i時取得,如果采用一般的神搜肯定會超時,所以這題還需要剪枝,剪枝條件有(從m層向上搜,假設(shè)前l(fā)evel層的體積為v,面積為s,當(dāng)前所得的最小面積為best):
1>因為前l(fā)evel層的體積為v,如果剩下的幾層的體積都取最小可能值,總體積還是比n大,那么則說明前l(fā)evel層的方案不可行,所以可以剪枝(剪枝條件為:v+minv[dep-1]>n)
2>因為前l(fā)evel層的面積為s,如果剩下的幾層的面積都取最小可能值,所得的面積和比已經(jīng)得到的所求的最小面積best大,也可以進行剪枝(剪枝條件為:s+mins[dep-1]>best)
3>因為前l(fā)evel層的體積為v,那么剩余的m-level層的體積滿足:n-v=(hk+……+hm)(k=level+1,……,m)
而剩余部分的表面積滿足:lefts=2*(r[k]h[k]+……+r[m]h[m])>2(n-sv)/r[level] (k=level+1,……,m)
顯然有上述不等式lefts=best-s>2(n-)/r,即2*(n-v)/r+s

#include<stdio.h> #define in(a,b) (a<b?a:b) int n,m; int minv[21],mins[21]; int bests;void dfs(int v,int s,int level,int r,int h)//level為搜索深度,從底層m層向上搜,r,h分別為該層的半徑和高度 {if(level==0)//搜索完成,則更新最小面積值{if(v==n&&s<bests)bests=s;return ;}if(v+minv[level-1]>n||s+mins[level-1]>bests||2*(n-v)/r+s>=bests)//剪枝 return ;int i,j,hh;for(i=r-1;i>=level;i--)//按遞減順序枚舉level層蛋糕半徑的每一個可能值,這里第level層的半徑最小值為level {if(level==m)//底面積作為外表面積的初始值(總的上表面積,以后只需計算側(cè)面積)s=i*i;hh=in((n-v-minv[level-1])/(i*i),h-1); //最大高度,即level層蛋糕高度的上限,(n-v-minv[level-1])表示第level層最大的體積for(j=hh;j>=level;j--)//同理,第level層的最小高度值為level dfs(v+i*i*j,s+2*i*j,level-1,i,j);//遞歸搜索子狀態(tài) } } int main() {int i;minv[0]=0;mins[0]=0;for(i=1;i<=20;i++)//從頂層向下計算出最小體積和表面積的可能值 {//從頂層(即第一層)到第i層的最小體積minv[i]成立時第j層的半徑和高度都是j minv[i]=minv[i-1]+i*i*i;mins[i]=mins[i-1]+2*i*i;}while(scanf("%d%d",&n,&m)==2){bests=0x7fffffff;dfs(0,0,m,n+1,n+1);if(bests==0x7fffffff)printf("0\n");elseprintf("%d\n",bests);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的DFS--POJ 1190 生日蛋糕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。