题意:

制作一个体积为Nπ(N<=10000)的M(M<=20)层生日蛋糕,每层都是一个圆柱体。

设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。

当i < M时。要求Ri > Ri+1且Hi > Hi+1。

因为要在蛋糕上抹奶油。为尽可能节约经费。我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 

令Q = Sπ 

请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。

(除Q外,以上全部数据皆为正整数)

分析:

表面积仅仅和底面圆面积和各层側面积有关

Q = Sπ

S = R1*R1 + 2*sigma(Ri*Hi(1<=i<=M))

N = sigma(Ri*Ri*Hi(1<=i<=M))

状态(i, Ri, Hi, Si-1, Di-1)  转移---> (i+1, Ri+1, Hi+1, Si, Di)

枚举变量 Ri,Hi,为了降低状态数,就要降低Ri,Hi的枚举范围。

最初一定有:

M-i<= Ri+1< Ri

M-i<= Hi+1< Hi

剪枝一:

预先计算

minS[i]  表示从上到下第一层到第i层最少要用去的S

minN[i]  表示从上到下第一层到第i层最少要用去的N

则有剪枝:

Si-1 +minS[m-i] >= best   //最优化剪枝

Di-1 + minN[m-i] >= N      //可行性剪枝

剪枝二:

从k层到m层添加的側面积

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWV3MWVi/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

Si-1 + 2*(N-Di-1)/Ri >=  best  //最优化剪枝

剪枝三:

假设先枚举Ri, 则Hi的上界 maxH = min(Hi  -1, N  -   Si-1   -   minN[M-i-1]) / (Ri*Ri)   )   //可行性剪枝

//先枚举Hi一样。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <string>
#include <set>
#include <map>
using namespace std; #define min(a,b) (a) <(b) ? (a):(b)
#define INF 0x3f3f3f3f
int minN[25], minS[25];
int N, M, Min; void init()
{
int i;
minN[0] = minS[0] = 0;
for(i=1; i<=21; ++i)
{
minS[i] = minS[i-1] + 2 * i * i;
minN[i] = minN[i-1] + i * i * i;
}
} void dfs(int k, int r, int h, int sums, int sumv)
{
if(k==M){
if(sumv == N && sums < Min)
{
Min = sums;
}
return ;
}
if(sums + minS[M-k] > Min ||sumv + minN[M-k] > N||2*(N-sumv)/r + sums >= Min)
return ;
for(int i=r-1; i>=M-k; --i)
{
if(k==0) sums = i * i; int maxH = min( h-1, (N-sumv-minN[M-k-1])/(i*i) );
for(int j=maxH; j>=M-k; --j)
dfs(k+1, i, j, sums + 2 * i * j, sumv + i * i * j);
}
} int main()
{
init();
while(cin>>N>>M)
{
Min = INF;
dfs(0, N, N, 0, 0); //K, R, H, SUMS, SUMV
if(Min<INF)
cout<<Min<<endl;
else
cout<<0<<endl;
}
return 0;
}

poj 1190 生日蛋糕 , 强剪枝的更多相关文章

  1. POJ - 1190 生日蛋糕 dfs+剪枝

    思路:说一下最重要的剪枝,如果当前已经使用了v的体积,为了让剩下的表面积最小,最好的办法就是让R尽量大,因为V = πR 2H,A' = 2πRH,A' = V / R * 2 ,最大的R一定是取当前 ...

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

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

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

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

  4. POJ 1190 生日蛋糕 剪枝

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

  5. POJ 1190 生日蛋糕题解

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

  6. POJ 1190 生日蛋糕(DFS)

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

  7. Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731

    生日蛋糕 时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...

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

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

  9. poj 1190 生日蛋糕

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

随机推荐

  1. PHP引用(&)的考察点

    引用的概念 在PHP中引用意味着用不同的名字访问同一个变量内容. 定义方式 使用 & 符号来表示 变量的引用 $a = 'ABC'; //开辟一块内存空间存储数据,$a指向该空间 $b = & ...

  2. CAD设置背景图片

    把图片作为背景图片可见但是不能编辑操作. 主要用到函数说明: _DMxDrawX::DrawImageToBackground 绘光栅图到背景.详细说明如下: 参数 说明 BSTR sFileName ...

  3. vue组件---组件注册

    (1)组件名 在注册一个组件的时候,我们始终需要给它一个名字.比如在全局注册的时候我们已经看到了: Vue.component('my-component-name', { /* ... */ }) ...

  4. spark学习(3)---集合

    一.list https://blog.csdn.net/xianpanjia4616/article/details/84930779 华为文档:https://support.huawei.com ...

  5. Java基础——接口

    一:接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数. 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部细节,只提供给用户接口(int ...

  6. EXP-00083: 调用 EXFSYS.DBMS_EXPFIL_DEPASEXP.schema_info_exp 时出现前一问题

    select owner,object_name,object_type,status from dba_objects where object_name = 'LT_EXPORT_PKG'; 如果 ...

  7. JavaScript--小白入门篇2

    一.布尔值和关系运算符.逻辑运算符 1.1 布尔值   我们上篇文章说了,学习了两种变量的类型数值型.字符串型.   实际上,还有很多变量的类型.我们今天再学习一种,叫做“布尔类型”. 数值型里面的值 ...

  8. cmake 学习笔记(一) buildsystem

    参见网址: http://www.cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html Introduction 基于CMake的构建 ...

  9. json转换时区问题-------前端展示时间少8小时--解决方法

    在application配置文件中加如下: spring.jackson.time-zone=GMT+8

  10. ZOJ 1654 Place the Robots

    题目大意: 在空地上放置尽可能多机器人,机器人朝上下左右4个方向发射子弹,子弹能穿过草地,但不能穿过墙, 两个机器人之间的子弹要保证互不干扰,求所能放置的机器人的最大个数 每个机器人所在的位置确定了, ...