这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求。

然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大高度开始深度优先搜索,每一层的蛋糕都从最大半径开始深搜,然后内循环里面同样是对应每一层不同半径不同高度的深搜,所以就是双重循环进行搜索。

但是在搜索之前我们要进行剪枝,第一个剪枝是在边界条件里面,如果层数等于零了,但是v还不等与零,我们就直接返回,如果体积等于零了说明此方案可行,然后把它和最小表面积进行比较并赋值。

或者层数还不等于零,但是此时的体积已经小于零了,我们也直接返回。

其余的剪枝都是在for循环里面进行的,我们首先进行最优性剪枝,并且预测一下如果之前的表面积加上这层的表面积再加上之后最小的层数对应的表面积,如果此时大于了已经求得的最优表面积,我们就直接返回。

与此对应的可行性剪枝就是,如果总体积减去之前的体积,减去这层的体积,再减去之后层数的最小体积小于零的话,我们也直接返回。

如果,这层的最大半径减去层数加一小于零了,或最大高度减去层数加一小于零了,我们也直接返回,因为每层的半径和高度都要大于上一层,所以最小的公差就是一,如果最宽泛的这个顶层范围都无法满足的时候,我们就不必再搜了。

最后一个剪枝就是假设之后的每一层蛋糕都按照最大的半径和高度建造,如果这时的体积依旧要小于我们要建的体积,我们也直接返回了。

因为这个深搜的范围很宽,而且题目当中的时间限制是一秒,所以我们剪枝剪得精细一些才能过。

代码如下:

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N,M;
int minArea=1<<30;
int area=0;
int minV[25];//k层及之上的蛋糕最小总体积
int minA[25];//k层及之上的蛋糕的最小表面积 void Dfs(int v,int n,int max_r,int max_h)
{
if (n==0) {
if (v!=0) {
return ;
}
else {
minArea=min(minArea,area);
return ;
}
}
if (v<0)
return ;
for (int r=max_r;r>=n;r--) {
if (n==M)
area=r*r;
for (int h=max_h;h>=n;h--) {
if (area+2*r*h>=minArea)
continue;
if (v-r*r*h-minV[n-1]<0)
continue;
if (max_r-n+1<=0||max_h-n+1<=0)
return ;
int sum=0;
for (int i=n-1;i>=0;i--) {
sum+=(r-i)*(r-i)*(h-i);
}
if (sum<v)
continue;
area+=2*r*h;
Dfs(v-r*r*h,n-1,r-1,h-1);
area-=2*r*h;
}
}
} int main()
{
cin>>N>>M;
int maxH,maxR;
memset(minV,0,sizeof(minV));
memset(minA,0,sizeof(minA));
for (int i=1;i<=20;i++) {
minA[i]=2*i*i+minA[i-1];
}//侧面积累加
for (int i=1;i<=20;i++) {
minV[i]=minV[i-1]+i*i*i;//最小体积累加
minA[i]+=i*i;//最小表面积累加
}
maxR=sqrt(N-minV[M-1]);
maxH=N-minV[M-1];
Dfs(N,M,maxR,maxH);
if (minArea==1<<30)
cout<<0<<endl;
else
cout<<minArea<<endl;
return 0;
}

POJ-1190 蛋糕问题的更多相关文章

  1. poj 1190 DFS 不等式放缩进行剪枝

    F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  2. POJ 1190(深搜)

    http://poj.org/problem?id=1190 又有好久没做搜索的题了,没想到做一个卡了我那么久,想哭啊. 一个中文题,思路呢也就是搜索呗,一层一层往上面搜,不过这里有两个比较重要的地方 ...

  3. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  4. 生日蛋糕 POJ - 1190 搜索 数学

    http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...

  5. 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕

    题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...

  6. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  7. poj 1190 生日蛋糕

    中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...

  8. POJ 1190 生日蛋糕(DFS)

    生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Descrip ...

  9. 生日蛋糕 POJ - 1190 (搜索+剪枝)

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

  10. 生日蛋糕 POJ - 1190

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

随机推荐

  1. Android Studio提示忽略大小写

    Android Studio的自动提示功能非常之强大,但是,如果你要输入“String”,你输入“string”,这个是不会提示的,也就是大小写敏感的,不爽是吗? 选择大小写不敏感就ok了!这样你想怎 ...

  2. POJ1050【DP】

    题意: 求一个最大子矩阵和. 思路: 枚举行区间,然后求一个最大子序列和. 贴一发挫code- #include <iostream> #include <cstdio> #i ...

  3. IT兄弟连 JavaWeb教程 HTTP协议

    超文本传输协议(HTTP,Hypertext Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的Web文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...

  4. web前端图片预加载

    是什么? 浏览器会缓存静态资源(hmtl/css/img等).图片预加载就是让浏览器提前缓存图片,提升用户体验. 浏览器什么情况下会下载图片? 1,解析到html中img的src属性的时候 2,解析到 ...

  5. curl:出现SSL错误提示

    在上一篇博文中,升级ruby版本中,提示如下错误: 1) Error fetching https://mirrors.aliyun.com/rubygems/: [root@web ~]# gem ...

  6. Beta版本发布!

    该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...

  7. hdu 3461 Code Lock 并查集(有点难想到)★★

    #include<stdio.h> #include<math.h> ]; int count; #define mod 1000000007 int find(int x) ...

  8. 第03课 在VMwave 14.0 上配置企业级CentOS 6.6操作系统

    第一部分:配置虚拟硬件 1.1 启动VMware,选择文件-->新建虚拟机(Ctrl + N),创建一个虚拟机. (VMware的安装过程较为简单,可自行百度.) 1.2 此时,出现新建虚拟机向 ...

  9. POM报错Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from

    解决方式一:   1.查看.m2\repository\org\apache\maven\plugins\maven-resources-plugin\下maven-resources-plugin- ...

  10. list的一些功能

    x = [1,5,2,3,4] 1.列表反转序: 函数法: x.reverse()该方法没有返回值但会对列表进行反向排序. 注意 不能y=x.reverse(),会得到None 如果要的话要y=rev ...