DFS:生日蛋糕

该文讨论了一个优化问题,即如何设计一个由m层圆柱体组成的生日蛋糕,每层具有不同的半径和高度,总体积为nπ,同时要求蛋糕的外表面面积Q最小。通过使用深度优先搜索策略,寻找满足条件的蛋糕结构,以达到节约成本的目的。
摘要由CSDN通过智能技术生成

制作一个体积为 nπ 的 m 层生日蛋糕,每层都是一个圆柱体。设从下往上数第 i 层蛋糕是半径 Ri、高度为 Hi 的圆柱。要求 Ri > Ri+1 且 Hi > Hi+1。由于要在蛋糕商抹奶油,所以为了尽可能节约经费,希望蛋糕外表面面积 Q 最小。令 Q = Sπ,对给出的 N 和 M,找出蛋糕的制作方案,使 S 最小。除了 Q 外,以上所有数据皆为正整数。
 

#include <iostream>
#include <cmath>
using namespace std;
int n,m;
int ans=10000;
int va[20];
void dfs(int u,int v,int s,int r0,int h0) {  //u层,v当前体积,s当前体积,
	if(u==m) {                   //r0半径,h0高度 
		if(v==n){
			if(ans>s){
				ans=s;
			}
		}
		return;
	}
	if(va[m-u]+v>n){
		return;
	}
	if(2.0*(n-v)/r0+s>ans){
		return;
	}
	for(int i=r0;i>=m-u;i--){
		for(int j=h0;j>=m-u;j--){
			int tv=v+i*i*j;
			if(tv>n){
				continue;
			}
			int ts=s+2*i*j;
			if(u==0){
				ts+=i*i;
			}
			dfs(u+1,tv,ts,i-1,j-1);
			
		}
	} 
}
int main(){
	cin>>n>>m;    //n为体积 ,m层 
	for(int i=1;i<=m;i++){
		va[i]=va[i-1]+i*i*i;
	}
	int r0=sqrt(n)+0.5;
	dfs(0,0,0,r0,n);
	if(ans==10000){
		ans=0;
	}
	cout<<ans;
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手的月光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值