[POJ 1190] 生日蛋糕
2015-07-19 21:50
330 查看
http://poj.org/problem?id=1190
集训队测试的时候老师找了这样一题,第一眼以为是个DP,但是发现DP的话内存不够用啊,无奈最后没写出来,百度之后发现居然是个搜索,不过对于数学太弱的我来说肯定是想不到的,因为要知道确定体积后把后面的全部做成一个圆柱的时候表面积是最小的。
集训队测试的时候老师找了这样一题,第一眼以为是个DP,但是发现DP的话内存不够用啊,无奈最后没写出来,百度之后发现居然是个搜索,不过对于数学太弱的我来说肯定是想不到的,因为要知道确定体积后把后面的全部做成一个圆柱的时候表面积是最小的。
[code]#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, m, minn; int mins[25],minv[25]; //保存对应深度的最小体积和面积 void Init() { minv[0] = 0; mins[0] = 0; for(int i = 1; i <= 20; i++){ mins[i] = mins[i-1] + 2*i*i; //i层的蛋糕最底层的最小半径和高度都是i。 minv[i] = minv[i-1] + i*i*i; } } int Dfs(int deep, int sums, int sumv, int maxr, int maxh)//深度,已经算过的面积和体积,最大半径和高度 { if(deep == 0){ if(sumv == n && sums < minn) minn = sums; return 0; } if(sumv + minv[deep] > n || sums + mins[deep] > minn || 2*(n - sumv)/maxr + sums >= minn)//剪枝 return 0; for(int i = maxr; i >= deep; i--){ if(deep == m) sums = i*i; for(int k = min((n - sumv - minv[deep-1])/(i*i), maxh); k >= deep; k--){//确定半径求最小高度 Dfs(deep-1, sums+2*i*k, sumv+i*i*k, i-1, k-1); } } } int main() { Init(); //freopen("D:\\7.in", "r", stdin); while(cin>>n>>m){ minn = 10000000; Dfs(m, 0, 0, n, n); if(minn == 10000000) minn = 0; cout<<minn<<endl; } return 0; }
相关文章推荐
- 判断无向图G是否连通
- 关系操作符(测试对象的等价性:判断对象的引用相等或对象的实际内容相等)附带源码
- libpods.a 缺少、红色 解决办法
- 硬件处理和软件处理之间的异同与边界
- edmx文件
- 判断无向图G是否连通
- linux之LAMP架构优化
- 龙的师父----良师的意义
- CSS3总结
- leetcode难度及面试频率
- OSI七层网络模型与TCP/IP四层网络模型
- OSI七层网络模型与TCP/IP四层网络模型
- HTTP协议(一)
- css样式float造成的浮动“塌陷”问题的解决办法
- 每天一个小知识点7( 4000 jQuer总结一)
- 一个windows应用程序内部到底有没有DLL文件的代码呢???它是如何调用DLL的???
- 删除、去掉字符串尾部的0或者某个特定字符(递归实现)
- hdu 4738 Caocao's Bridges tarjan
- 想要应聘产品经理,从现在开始应该做些什么?
- [leetcode] 205.Isomorphic Strings