生日蛋糕(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)(搜索剪枝)生日蛋糕的主要内容,如果未能解决你的问题,请参考以下文章
[dfs] aw168. 生日蛋糕(dfs剪枝与优化+分类讨论+思维+公式推导+数学+好题)