C++ 代码
//author : A Fei
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 30, INF = 0x3f3f3f3f;
int R[N], H[N], pre_v[N], pre_s[N];
int n, m;
int ans = INF;
void init()
{
for(int i = 1; i <= m; i ++)
{
pre_v[i] = pre_v[i - 1] + i * i * i;
pre_s[i] = pre_s[i - 1] + 2 * i * i;
}
}
void dfs(int u, int v, int s)//第u层蛋糕,当前使用的体积,当前使用的面积
{
if(n < v + pre_v[u]) return ;//剩余体积不够剩下层所需最少体积
if(s + pre_s[u] >= ans) return;
if(2 * (n - v) / R[u + 1] + s >= ans) return;
if(!u)
{
if(v == n) ans = s;
return;
}
//枚举Ru
for(int r = min(R[u + 1] - 1, (int)sqrt(n - v)); r >= u; r --)
for(int h = min(H[u + 1] - 1, (n - v) / r / r); h >= u; h --)
{
int sum_s = 0, sum_v = 0;
if(u == m) sum_s += r * r;
R[u] = r;
H[u] = h;
sum_s += 2 * r * h;
sum_v += r * r * h;
dfs(u - 1, v + sum_v, s + sum_s);
}
}
int main()
{
cin >> n >> m;
init();
R[m + 1] = H[m + 1] = INF;
dfs(m, 0, 0);
if(ans == INF) cout << 0 << endl;//未搜到答案
else cout << ans << endl;
return 0;
}