zoukankan      html  css  js  c++  java
  • poj1190 生日蛋糕 dfs


    题意:生日蛋糕有m层,总体积是V。从下向上,每一层的半径r和高度h都是递减的。

    给m、v,求最小的表面积s。(不算底面接地的面积)

    题目链接:poj1190


    剪枝都还没加。。样例输出都是错的。。。还没找到问题。。。


    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #define inf 0x3f3f3f3f
    using namespace std;
    
    int ans,V,M,flag,s;
    
    int dfs(int v,int m,int newr,int newh)
    {
        int r,h,tmp,i;
        if(m==0)
        {
            flag=1;
            if(v==0&&s<ans) ans=s;
            return 0;
        }
        for(i=1,tmp=0;i<=m;i++)//若之后每层都取最小值
            tmp+=(i*i*i);
        if(tmp>v) return 0;//依然大于剩余的v 那么一定不可能
        tmp-=(m*m*m);
        for(r=newr;r>=m;r--)
        {
            for(h=newh;h>=m;h--)
            {
                //for(i=0,tmp=0;i<m;i++)//每层取最大值  //这个剪枝加了也有问题
                //    tmp+=(r-i)*(r-i)*(h-i);
                //if(v>tmp) break;//依然小于v 也不可能
                if(m==M) s+=r*(2*h+r);
                else s+=2*r*(h+r);
                if(s<ans) dfs((v-(r*r*h)),m-1,r-1,h-1);
                if(m==M) s-=r*(2*h+r);
                else s-=2*r*(h+r);
            }
        }
        return 0;
    }
    
    int main()
    {
        while(~scanf("%d%d",&V,&M))
        {
            ans=inf;
            s=0;
            flag=0;
            dfs(V,M,1000,1000);
            printf("%d
    ",flag?ans:0);
        }
        return 0;
    }
    


  • 相关阅读:
    又见博弈
    两道来自CF的题
    温习及回顾
    笔试面试总结
    Python Cha4
    初学ObjectiveC
    设计模式汇总(三)
    转贴XML的写法建议
    让从Objec中继承的类也拥有鼠标事件
    关于异常处理的一些看法
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3278017.html
Copyright © 2011-2022 走看看