1190:生日蛋糕

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_46028214/article/details/113996695