生日蛋糕

https://www.luogu.com.cn/problem/P1731
题目描述

已知蛋糕体积和层数,求表面积的最小值。

输入

第一行为一个整数N(N≤2×10^4),表示待制作的蛋糕的体积为 Nπ。

第二行为M(M≤15),表示蛋糕的层数为M。

输出格式

输出一个整数 S为蛋糕的表面积(除下底面外),若无解,输出 0。

注:所有数据均为整数

分析

表面积=最下面一层的底面积加每一层的侧面积=r_1^2+2r_1h_1+2r_2h_2+……+2r_mh_m
体积=r_12*h_1+r_22h_2+……+r_m^2h_m

#include<bits/stdc++.h>
using namespace std;
int n,m,ans=1e9;
void dfs(int x,int s,int v,int r,int h)//x当前层数,s表面积,v剩余体积,r上一层的半径,h上一层的高度
{ 
	if(s>=ans) return;//优化一,当前表面积大于已知最小值
	if(r<m-x+2||h<m-x+2) return;//优化二,因为r、h递减且为整数,保证每一层减一的情况下之后的r和h均大于零,,,有奇效
	if(v/r*2+s>ans) return;//用剩余体积推算之后的最小面积,与已知最小值比较
	if(v==0&&x==m+1)
	{
		ans=min(ans,s);
		return;
	}
	for(int i=r-1;i>0;i--)
		for(int j=h-1;j>0;j--)
		{
			if(v-i*i*j>=0&&x<=m)
			{
				dfs(x+1,s+2*i*j,v-i*i*j,i,j);
			}
		}
}
int main()
{
	
	cin>>n>>m;
	for(int i=sqrt(n);i>0;i--)
	for(int j=n/i/i;j>0;j--)
	{
		dfs(2,i*i+2*i*j,n-i*i*j,i,j);
	}
	cout<<ans;
	return 0;
}
原文地址:https://www.cnblogs.com/qwq-/p/13439384.html