POJ1190[DFS经典]

来源:互联网 发布:sql truncate 外键 编辑:程序博客网 时间:2024/06/16 13:29

分蛋糕

题目链接

题意:中文提不说了...
题目类型:DFS

题解:如果一开始我单独看到这道题,肯定不会朝搜索方向想。。。这里要积累一下思路。因为M,N的数据范围给定,且数据范围满足递减的要求,因此解空间有限,应该有搜索的想法,看看数据好像可以搜,考验剪枝水平;

爆搜方法,就是每次枚举100以内的半径,1000以内的高,搜索m层(m<=20),如果体积为刚好就存下结果,每一次取最小值;

剪枝部分,如果当前的圆柱半径与高度能够成的最大体积小于剩余体积,就结束;如果当前的面积大于之前搜到的最小面积,就结束;最后一个剪枝,不容易想到,如果到第k层时剩下第k到第M层的面积 2*Ri*Hi>2*Ri*Ri*Hi/Rk=2*Vi, 全部加起来就是 2*leftV, 所以 A+2*leftV>min 可以剪枝;

Code:

#include <iostream>#include <cstdio>#include<cstring>#include<algorithm>#include <string>#include <queue>#include <map>#define ll long long#define INF 0x3f3f3f3fusing namespace std;int N,M,ans=0;void dfs(int leftv ,int m , int A , int lastR , int lastH){    ///剪枝    if(A>ans&&ans)return ;    if(leftv<0)return ;    if( m * (lastR - 1) * (lastR - 1) * (lastH - 1) < leftv && m != M)return;///当前的极限体积小于剩下的体积    ///    if(!m)    {        if(!leftv&&(A<ans||!ans))        {            ans=A;        }        return;    }    for(int r = lastR - 1 ; r >= m ; r--)///还剩m层,因此最小半径为m    {        for(int h = lastH - 1 ; h >= m ; h--)        {            ///剪枝            if(A+2*leftv/r > ans && ans)///从100ms+优化到32ms                return ;            int curv=leftv-r*r*h;            int curA=A+2*r*h;            if(m==M)curA+=r*r;///如果是第一层,就加上底面积            dfs(curv , m - 1 , curA , r , h);        }    }}int main(){    scanf("%d%d",&N,&M);    dfs(N,M,0,100,1000);    cout << ans << endl;    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卖家要我开出质量问题证明怎么办 闲鱼买到的商品不符合描述怎么办 寄出去的东西碎了怎么办 闲鱼快递损坏了怎么办 寄快递东西坏了怎么办 快递邮寄东西坏了怎么办 快递被别人拆了怎么办 淘宝买的东西包装破损怎么办 寄血液被退回来怎么办 快递被安检扣了怎么办 淘宝原单退回运费怎么办 运输过程中包裹破损怎么办 天猫没收到货签收怎么办 收到的快递坏了怎么办 自寄的快递少了怎么办 邮的东西弄坏了怎么办 物流签收后发现货物损坏怎么办 发现客人损坏了酒店物品怎么办 东西坏了签收了怎么办 朋友圈贩卖三无产品你怎么办 付钱给微商没有保障怎么办 电镀锌钢带生锈怎么办 电机机油从空气滤芯里流出怎么办 把塑料皮套吃了怎么办 塑料框眼镜有点小了怎么办 出口纸箱打了钉怎么办 买房子交款单据丢了怎么办 买房子所有单据丢失怎么办 车险单据都丢了怎么办 真空包装的东西里面有空气怎么办 发货物忘记写唛头了怎么办 Word文档撤销按钮删除了怎么办 ai保存时未响应怎么办 ai还没保存卡了怎么办 ai卡住了没保存怎么办 屁股沟有硬块红肿怎么办 卧室床选太大了怎么办 画板的笔尖掉了怎么办 宜家水壶盖子有水怎么办 背滤鱼缸除油膜怎么办 书多了没地方放怎么办