POJ1190生日蛋糕题解
来源:互联网 发布:部落冲突九本满防数据 编辑:程序博客网 时间:2024/04/30 12:02
题目地址
http://poj.org/problem?id=1190
解题思路
这是一道深度优先搜索的题目,难点在于剪枝,题目中进行三次剪枝即可。
#include<cstring>#include<cstdio>using namespace std;const int INF = 1 << 30;const int MAXM = 20 + 2;int minv[MAXM],mins[MAXM];//设置当前最小的面积和体积int N,M,ans;void init()//把最小的面积体积初始化{int i,j;minv[0]=0;mins[0]=0;for(i=1;i<=M;i++){minv[i]=minv[i-1]+i*i*i;mins[i]=mins[i-1]+2*i*i;}}int min(int a,int b){return a<b?a:b;}void dfs(int s,int v,int k,int r,int h){if(k==0){if(v==N&&ans>s)ans=s;return;}if (v + minv[k] > N || s + mins[k] > ans || s + 2 * (N - v) / r > ans) return;//如果当前体积加上以后最小的体积也超过给定体积,就剪枝。如果当前面积加上以后最小面积大于ans,就剪枝。如果当前面积加上 下一个圆柱体可能的最大表面积大于ans,就剪枝。int rr,hh;for(rr=r-1;rr>=k;--rr){hh=min(h-1,(N-v-minv[k-1])/(rr*rr));for(;hh>=k;--hh){if(k==M)s=rr*rr;dfs(s+2*rr*hh,v+rr*rr*hh,k-1,rr,hh);}}}int main(){while (scanf("%d%d", &N, &M)!=EOF){ans = INF;init();dfs(0, 0, M, N , N );if (ans != INF){ printf("%d\n", ans); }else{ printf("0\n"); }}return 0;}
0 0
- POJ1190生日蛋糕题解
- poj1190 生日蛋糕
- poj1190生日蛋糕
- poj1190生日蛋糕
- poj1190 生日蛋糕
- POJ1190-生日蛋糕
- POJ1190生日蛋糕
- poj1190 生日蛋糕
- poj1190 生日蛋糕 dfs
- poj1190 生日蛋糕 搜索+剪枝
- poj1190深搜 生日蛋糕
- POJ1190 生日蛋糕(DFS)
- Poj1190 生日蛋糕 DFS
- poj1190 生日蛋糕 -dfs
- poj1190 生日蛋糕 dfs
- poj1190——生日蛋糕
- poj1190 生日蛋糕 (搜索剪枝)
- poj1190生日蛋糕(dfs+剪枝)
- 将cantk runtime嵌入到现有的APP中
- 想写什么写什么
- [UE4.4.x] 虚幻4 安卓打包
- 七巧板涂色 c++
- Unity3d优化之路
- POJ1190生日蛋糕题解
- POJ 1321--棋盘问题【DFS】
- HDU5119.Happy Matt Friends
- H.264码流结构
- EQueue - 一个C#写的开源分布式消息队列的总体介绍
- 21.View,Label,Button,TextField
- windows下解决快捷键失效的万能方法
- hdu3768Shopping 最短路+暴力
- ios 给label添加横线