poj1190 生日蛋糕(dfs应用)

poj1190 生日蛋糕(dfs应用)

要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。
设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时
,要求Ri > Ri+1且Hi > Hi+1。
由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的
下底面除外)的面积Q最小。
令Q = Sπ
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小

(除Q外,以上所有数据皆为正整数)

#include<iostream>
#include<algorithm>
using namespace std;
int minarea=1<<30;
int area=0;
int n=0,m=0,maxr=0,maxh=0;
void dfs(int n,int v,int r,int h)
{
	if(n==0)
	{
		if(v!=0)
		return ;
		else
		minarea=min(area,minarea); 
		return; 
	}
	if(v<=0)
	return;
	for(int rr=r;r>=n;rr--)
	{
		if(n==m)
		area=rr*rr;
		for(int hh=h;hh>=n;hh--)
		{
			area+=2*rr*hh;
			if(area>=minarea)
			continue;
			if(r-1<=0||h-1<=0)
			continue;
			int i=1;
			int sum=0;
			while(i<=n)
			{
				int v;
				v=i*i*i;
				sum+=v;
				i++;
			}
			if(sum>v||sum<v)
			continue;
			dfs(v-rr*rr*hh*hh,n-1,r-1,h-1);
			area-=2*rr*hh;
		}
	 } 
}
int main()
{

	cin>>n>>m;
	maxr=n/2+1;
	maxh=n/2+1;
	dfs(n,m,maxr,maxh);
	cout<<minarea;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值