[POJ1190]生日蛋糕

时间:2023-03-09 18:17:25
[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=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';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==){
if(V==n)min_Q=min(min_Q,Q);
return;
}
if(V+lminV[step]>n || Q+lminQ[step]>min_Q)return;
if(*(n-V)/r+Q>=min_Q)return;
int max_R=r-;
for(int i=max_R; i >= step; i--){
if(step==m)Q=i*i;
int max_H=min(((n-lminV[step-]-V)/(i*i)), h-);
for(int j=max_H; j >= step; j--)
dfs(V+i*i*j, Q+*i*j, step-, i, j);
}
} int main(){
n=read();m=read();
lminQ[]=,lminV[]=;
for(int i=;i<;i++)
lminQ[i]=lminQ[i-]+*i*i,lminV[i]=lminV[i-]+i*i*i;
min_Q=inf;
dfs(,,m,,);
if(min_Q<inf)cout<<min_Q<<endl;
else cout<<<<endl;
return ;
}

题不错

下次再来思考思考

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

不全是自己想的