码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-02-07 12:48:14      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:数据   files   搜索   mat   输出   page   提示   editor   gre   

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)(搜索剪枝)生日蛋糕

标签:数据   files   搜索   mat   输出   page   提示   editor   gre   

原文地址:http://www.cnblogs.com/A1269180380/p/6373325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!