poj1190 生日蛋糕(dfs应用)
要制作一个体积为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外,以上所有数据皆为正整数)
#include<iostream>
#include<algorithm>
using namespace std;
int minarea=1<<30;
int area=0;
int n=0,m=0,maxr=0,maxh=0;
void dfs(int n,int v,int r,int h)
{
if(n==0)
{
if(v!=0)
return ;
else
minarea=min(area,minarea);
return;
}
if(v<=0)
return;
for(int rr=r;r>=n;rr--)
{
if(n==m)
area=rr*rr;
for(int hh=h;hh>=n;hh--)
{
area+=2*rr*hh;
if(area>=minarea)
continue;
if(r-1<=0||h-1<=0)
continue;
int i=1;
int sum=0;
while(i<=n)
{
int v;
v=i*i*i;
sum+=v;
i++;
}
if(sum>v||sum<v)
continue;
dfs(v-rr*rr*hh*hh,n-1,r-1,h-1);
area-=2*rr*hh;
}
}
}
int main()
{
cin>>n>>m;
maxr=n/2+1;
maxh=n/2+1;
dfs(n,m,maxr,maxh);
cout<<minarea;
return 0;
}