#include<stdio.h>
#include<math.h>
const int INF=100000000;
int minS[21],minV[21],ans,n,m;
void dfs(int depth,int r,int h,int leaveV,int sumS) //参数依次表示当前正访问depth层,该层最大半径和高度是r,h,剩余未用空间leaveV,已用空间的面积
{
if(depth==0)
{
if(leaveV==0&&sumS<ans) ans=sumS;
return;
}
if(sumS+minS[depth]>ans||leaveV<minV[depth]) return;
for(int i=r-1;i>=depth;i--)
{
int startH=(leaveV-minV[depth-1])*1.0/i/i;
if(startH>h-1) startH=h-1;
for(int j=startH;j>=depth;j--)
{
if(minS[depth-1]+sumS+2*i*j>=ans) continue;
if(depth==m) dfs(depth-1,i,j,leaveV-i*i*j,sumS+2*i*j+i*i);
else dfs(depth-1,i,j,leaveV-i*i*j,sumS+2*i*j);
}
}
}
int main()
{
minV[0]=0;
minS[0]=0;
for(int i=1;i<=20;i++) //整个模型的下界情形是是第一层高度和半径为1,第二层高度和半径为2,依次类推
{
minV[i]=minV[i-1]+i*i*i;
minS[i]=minS[i-1]+2*i*i;
}
while(scanf("%d%d",&n,&m)!=EOF)
{
int maxR=(int)sqrt((n-minV[m-1])*1.0/m)+1; //最后一层半径的上界
int maxH=(n-minV[m-1])*1.0/m/m+1; //最后一层高度的上界
ans=INF;
dfs(m,maxR,maxH,n,0); //从最后一层开始自下而上搜索
if(ans==INF) printf("0\n");
else printf("%d\n",ans);
}
return 0;
}
|