生日蛋糕(DFS)(搜索剪枝)生日蛋糕

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生日蛋糕(DFS)(搜索剪枝)生日蛋糕相关的知识,希望对你有一定的参考价值。

1277: 生日蛋糕

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 10
[提交][状态][讨论版]

题目描述

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外,以上所有数据皆为正整数)

输入

有两行,第一行为n(n≤10000),表示待制作的蛋糕的体积为nπ;第二行为m(m≤20),表示蛋糕的层数为m。

输出

仅一行,是一个正整数S(若无解则S=0)。

样例输入

100
2

样例输出

68

提示

附:圆柱公式

体积V=π (r^2) h

侧面积A’=2 π r h

底面积A=π r^2

来源

#include <iostream>  
#include <cmath>  
using namespace std;  
int n,m,minv[21],mins[21],mn=10000000000;               
  
void DFS(int i,int v,int s,int r,int h)   
{  
    if(0==i)  
    {  
        if(v==n&&s<mn)            
        {  
            mn=s;  
        }  
        return;  
    }   
    if(v+minv[i-1]>n||s+mins[i-1]>mn||s+2*(n-v)/r>=mn)    
        return;  
    for( int j=r-1;j>=i;j--)  
    {  
        if(i==m)  
            s=j*j;     
        for(int k=h-1;k>=i;k--)   
        {  
            DFS(i-1,v+j*j*k,s+2*j*k,j,k); 
        }  
    }  
}  
int main(void)  
{  
    cin>>n;   
    cin>>m;                  
    minv[0]=mins[0]=0;  
    for(int i=1;i<=m;i++)  
    {                                
        minv[i]=minv[i-1]+i*i*i;   
        mins[i]=mins[i-1]+2*i*i;  
    }  
    DFS(m,0,0,(int)sqrt(n),n);
    cout<<mn<<endl; 
    return 0;  
}  

 









以上是关于生日蛋糕(DFS)(搜索剪枝)生日蛋糕的主要内容,如果未能解决你的问题,请参考以下文章

POJ - 1190生日蛋糕 (dfs+剪枝)

生日蛋糕 (poj1190) (dfs剪枝)

[dfs] aw168. 生日蛋糕(dfs剪枝与优化+分类讨论+思维+公式推导+数学+好题)

poj1190生日蛋糕--DFS

POJ 6048 泰国佛塔 dfs搜索疯狂剪枝!北大ACM/ICPC竞赛训练

『生日蛋糕 搜索剪枝』