1190:生日蛋糕
题目链接http://bailian.openjudge.cn/practice/1190/
#include<iostream>
#include<algorithm>
#include<cstring>
/*
有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。
*/
using namespace std;
int n, m;
int minS = (1 << 30);
int totalS = 0, totalV = 0;
int min_s[30], min_v[30];
void dfs(int c, int r, int h) {
if (c == m) {
if(totalV==n)
minS = min(minS, totalS);
return;
}
if (h < m - c|| r<m-c || min_v[m-c]+totalV>n||min_s[m-c]+totalS>minS)//半径和高都不满足,最小体积面积超过最优值
return;
if (r * r * h * (m - c) + totalV < n)//最大体积也不满足
return;
for (int i = r; i > 0; i--) {
for (int j = h; j > 0; j--) {
if (c == 0) {
totalS = 2 * i * j+i*i;
totalV = i * i * j;
}
else {
totalS += 2 * i * j;
totalV += i * i * j;
}
dfs(c + 1, i - 1, j - 1);
if (c == 0) {
totalS = 0;
totalV = 0;
}
else {
totalS -= 2 * i * j;
totalV -= i * i * j;
}
}
}
}
int main() {
cin >> n >> m;
min_s[0] = 0, min_v[0] = 0;
for (int i = 1; i <= 20; i++) {
min_s[i] = min_s[i - 1] + i * i * 2;
min_v[i] = min_v[i - 1] + i * i * i;
}
dfs(0, 100, 10000);//这里的r,h是直接大概估摸着算的;
if (minS == (1 << 30))
minS = 0;
cout << minS;
return 0;
}