题目链接

题意:给你蛋糕的总体积和有几层,且蛋糕满足从低到高一层比一层的面积小,高度低。求最小的外表面积。

思路:因为求外表面积,实际上就是求每一层的侧面积+最底层的上表面积。然后可以算出最小的每层面积,便于剪枝,然后从下往上DFS,不断枚举高度和半径就可以解决问题。

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
int n,m;
int r[25],h[25];
int V[25],S[25];
const int INF=1e9;
int ans=INF;
void dfs(int dep,int v,int s)
{
    if(s+S[dep]>ans)
    return;
    if(2*(n-v)/r[dep+1]+s>ans)
    return;
    if(!dep)
    {
        if(v==n)
        ans=s;
        return;
    }
    for(int i=min((int)sqrt(n-v),r[dep+1]-1);i>=dep;i--)
    {
        for(int j=min((n-v)/i/i,h[dep+1]-1);j>=dep;j--)
        {
            int t=0;
            if(dep==m)
            t=i*i;
            r[dep]=i;
            h[dep]=j;
            dfs(dep-1,v+i*i*j,s+2*i*j+t);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        S[i]=S[i-1]+2*i*i;
    }
    r[m+1]=h[m+1]=1e9;
    dfs(m,0,0);
    if(ans==INF)
    ans=0;
    printf("%d\n",ans);
}