POJ1190 生日蛋糕(回溯法)

cuicuiv-POJ刷题

点击此处跳转原题界面---->生日蛋糕

回溯法:是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
——在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。*

自我粗俗理解:回溯法是一个深度优先算法。当来到一个解的结点时,当解满足当前最优则展开下一结点,当解不满足最优则退回上一结点。不死磕,可以就继续往下搜索,不可以便回头找最初匹配的结点

题目描述
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为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外,以上所有数据皆为正整数)

**概述:**制作一个M层 体积为Nπ的生日蛋糕(每层都是圆柱体)
层数序号从下往上编号 当层数小于输入层数时(i < M)
下一层的半径和高度均大于上一层(Ri > Ri+1且Hi > Hi+1)
求使蛋糕外表面最小的情况

Input
第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;
第二行为M(M <= 20),表示蛋糕的层数为M。

Output
整数S(最小面积)

供参考数学公式

圆柱公式
体积V = πR2H
侧面积A’ = 2πRH
底面积A = πR2

源代码为C++

定义Cake类,编写蛋糕类的属性以及方法

#include<iostream>
#include<cmath>
#include<algorithm>
#include<functional>
#include<climits>
using namespace std;
class Cake
{
   
protected:
    int N;//需要的总体积
    int M;//蛋糕层数
    int *minSc;//最小侧表面积
    int *minV;//最小体积
    int minArea;//最优值
    int area;//已有表面积
    int MaxVF(int n,int r,int h);
    //在蛋糕有n层 最大半径炜r 最大高度为h的情况下 得出的最大体积
    void DFS(int v,int top,int r,int h);//深度优先搜索所有蛋糕搭
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值