制作一个体积为 nπ 的 m 层生日蛋糕,每层都是一个圆柱体。设从下往上数第 i 层蛋糕是半径 Ri、高度为 Hi 的圆柱。要求 Ri > Ri+1 且 Hi > Hi+1。由于要在蛋糕商抹奶油,所以为了尽可能节约经费,希望蛋糕外表面面积 Q 最小。令 Q = Sπ,对给出的 N 和 M,找出蛋糕的制作方案,使 S 最小。除了 Q 外,以上所有数据皆为正整数。
#include <iostream>
#include <cmath>
using namespace std;
int n,m;
int ans=10000;
int va[20];
void dfs(int u,int v,int s,int r0,int h0) { //u层,v当前体积,s当前体积,
if(u==m) { //r0半径,h0高度
if(v==n){
if(ans>s){
ans=s;
}
}
return;
}
if(va[m-u]+v>n){
return;
}
if(2.0*(n-v)/r0+s>ans){
return;
}
for(int i=r0;i>=m-u;i--){
for(int j=h0;j>=m-u;j--){
int tv=v+i*i*j;
if(tv>n){
continue;
}
int ts=s+2*i*j;
if(u==0){
ts+=i*i;
}
dfs(u+1,tv,ts,i-1,j-1);
}
}
}
int main(){
cin>>n>>m; //n为体积 ,m层
for(int i=1;i<=m;i++){
va[i]=va[i-1]+i*i*i;
}
int r0=sqrt(n)+0.5;
dfs(0,0,0,r0,n);
if(ans==10000){
ans=0;
}
cout<<ans;
return 0;
}