//這道題可以通過一般的搜尋找到思路,但是很顯然會超時所以需要優化
//其中需要三重優化:第一重是如果已用面積+最小面積仍然超過最優答案就返回
//第二重是如果已用體積+最小體積仍然超過要求體積就返回
//第三重剪枝是假設剩餘所有的體積都用來做下一層那麼此時下一層的體積是最大,而半徑會最大,從而表面積最小
#include
#include
using
namespace
std;
int m,n,minv[21],mins[21],best;
void read() }
void search(int
floor,int r,int h,int s,int v)//對每層蛋糕進行搜尋,已經用的面積和體積
if(s+mins[floor]>=best)return;//剪枝1,最優性剪枝
if(vfloor])return;//剪枝2,根據下界進行可行性剪枝
maxv=0;
for(i=floor;i>=1;i--)
maxv+=(r-i)*(r-i)*(h-i);//最大方式做蛋糕
if(maxvreturn; //剪枝3,根據上界進行可行性剪枝
for(i=r-1;i>=floor;i--) //列舉floor層蛋糕的半徑
for(j=h-1;j>=floor;j--) //列舉floor層蛋糕的高度
search(floor-1,i,j,s+2*i*j,v-i*i*j);
}int main()
cout
<}
P1731 生日蛋糕
原題鏈結 dfs 注意剪枝 這個剪枝還挺麻煩的 首先是最優性剪枝 如果當前的面積 之後可行的最小面積仍然大於現在的最優解 那麼捨去 可行性剪枝 如果當前的體積 之後可行的最大體積仍小於規定體積 捨去從大到小列舉是為了方便確定範圍 include include include include inc...
洛谷 P1731 生日蛋糕
7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層 生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i include include include include using namespace std const int...
洛谷 P1731 生日蛋糕
7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層 生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當iri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 的面積q最小。令...