还是有些迷。。留坑
前两个剪枝是看在当前情况下能不能构成一个蛋糕
第三个剪枝是看当前情况下能不能形成最优解
using namespace std;
int prevv[50],press[50];
int vv,ll,ans;
void init()
{
    int i;
    for(i=1;i<=20;i++)
    {
        prevv[i]=prevv[i-1]+i*i*i;
        press[i]=press[i-1]+2*i*i;
    }
    return;
}
void dfs(int r,int h,int l,int s,int v)
{
    int i,j,maxx;
    if(l==0)
    {
        if(v==vv)
        {
            ans=min(ans,s);
        }
        return;
    }
    if(vv-v<prevv[l]||ans-s<press[l]) return;
    if(l<ll&&2*(vv-v)/r>ans-s) return;
    for(i=r;i>=l;i--)
    {
        if(l==ll)
        {
            s=i*i;
        }
        maxx=(vv-prevv[l-1]-v)/(i*i);
        for(j=min(maxx,h);j>=l;j--)
        {
            dfs(i-1,j-1,l-1,s+2*i*j,v+i*i*j);
        }
    }
    return;
}
int main()
{
    int i,j;
    init();
    while(scanf("%d%d",&vv,&ll)!=EOF)
    {
        ans=N;
        dfs((int)sqrt(vv),vv,ll,0,0);
        printf("%d\n",ans);
    }
    return 0;
}
                










