[POJ 1190] 生日蛋糕
来源:互联网 发布:怎样在淘宝上卖手机 编辑:程序博客网 时间:2024/05/23 00:09
http://poj.org/problem?id=1190
集训队测试的时候老师找了这样一题,第一眼以为是个DP,但是发现DP的话内存不够用啊,无奈最后没写出来,百度之后发现居然是个搜索,不过对于数学太弱的我来说肯定是想不到的,因为要知道确定体积后把后面的全部做成一个圆柱的时候表面积是最小的。
#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;}
0 0
- poj 1190 生日蛋糕
- poj 1190 dfs(生日蛋糕)
- POJ 1190 生日蛋糕
- POJ 1190 生日蛋糕
- poj 1190 生日蛋糕
- 【DFS】poj 1190 生日蛋糕
- POJ 1190 生日蛋糕
- POJ 1190 生日蛋糕
- [POJ 1190] 生日蛋糕
- poj 1190 生日蛋糕
- POJ 1190 生日蛋糕
- poj 1190 生日蛋糕
- 生日蛋糕POJ 1190
- POJ 1190 生日蛋糕
- poj 1190 生日蛋糕
- POJ 1190 生日蛋糕
- POJ 1190 生日蛋糕
- poj 1190 生日蛋糕
- 龙的师父----良师的意义
- 【Linux调试技巧----标准输出重定向到文件】dup2和dup的妙用
- 硬件处理和软件处理之间的异同与边界
- libpods.a 缺少、红色 解决办法
- 关系操作符(测试对象的等价性:判断对象的引用相等或对象的实际内容相等)附带源码
- [POJ 1190] 生日蛋糕
- Oracle 利用储存过程插入循环插入大量数据方法
- 判断无向图G是否连通
- VMWare Workstation 11.0安装Mac OS虚拟机(一)
- Android 快速开发系列 打造万能的ListView GridView 适配器
- Git版本控制:Git分支处理
- 牛腩新闻发布系统完成总结
- 正斜杠(/)与反斜杠(\)区别
- Red and Black(DFS)