[POJ1190]生日蛋糕<DFS>

题目链接:http://poj.org/problem?id=1190

题看上去确实很复杂

涉及到半径面积这些,其实看着真的很头疼

但是除去这些就是剪枝优化的dfs算法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<utility>
#include<stack>
#include<cstdlib>
#define ll long long
#define inf 0x3fffffff
#define maxn 10005
#define maxm 30
using namespace std;

int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

void fre(){
     freopen("     .in","r",stdin);
     freopen("     .out","w",stdout);
}

int lminQ[maxm], lminV[maxm];
int min_Q;
int n,m;

void dfs(int V, int Q, int step, int r, int h){
    if(step==0){
        if(V==n)min_Q=min(min_Q,Q);
        return;
    }
    if(V+lminV[step]>n || Q+lminQ[step]>min_Q)return;
    if(2*(n-V)/r+Q>=min_Q)return;
    int max_R=r-1;
    for(int i=max_R; i >= step; i--){
        if(step==m)Q=i*i;
        int max_H=min(((n-lminV[step-1]-V)/(i*i)), h-1);
        for(int j=max_H; j >= step; j--)
            dfs(V+i*i*j, Q+2*i*j, step-1, i, j);
    }
}

int main(){
    n=read();m=read();
    lminQ[0]=0,lminV[0]=0;
    for(int i=1;i<22;i++)
        lminQ[i]=lminQ[i-1]+2*i*i,lminV[i]=lminV[i-1]+i*i*i;
    min_Q=inf;
    dfs(0,0,m,100,10000);
    if(min_Q<inf)cout<<min_Q<<endl;
    else cout<<0<<endl;
    return 0;
}
View Code

题不错

下次再来思考思考

这次借鉴了其他博主的思路

不全是自己想的

 

posted @ 2020-02-12 22:07  Danzel♂  阅读(120)  评论(0编辑  收藏  举报