首先吐槽一下求面积和体积不用π。
其实不减枝的代码还是很好写的:
//m为蛋糕的层数
//v为当前已涂的体积
//s为当前已涂得到的S
//r和h为当前层的半径和高
void dfs(int m,int v,int s,int r,int h)
{
//推出条件
if(m == 0)
{
if(ans > s && v == N) ans = s;
return;
}
//枚举可能的解
for(int i = r-1; i >= m; i--)
{
for(int j = maxh; j >= m; j--)
{
if(m == M) s = i * i;
dfs(m-1,v+i*i*j,s+2*i*j,i,j);
}
}
}
然后就是减枝呢,四个减枝的条件:
先打表,算出每层蛋糕的最小体积和表面积(minv[i]和mins[i]),然后在来减枝
一、v+minv[m-1] > V
v为已经涂的体积,那么如果v加上下一层最小的体积比总体积V还大,这显然是不可能的,减去
二、s+min[m-1] > ans
s为已经涂的面积,那么s加上下一次最小的面积比当前求得的ans还大,显然不需要dfs了,减去
三、2*(V-v)/r + s >= ans
已经涂了