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
原创粉丝点击