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);//深度优先搜索所有蛋糕搭