首页 > 代码库 > poj 1190(dfs剪枝)
poj 1190(dfs剪枝)
先初始化算出n层蛋糕所需的最小体积,用其剪枝,可以大大提升速度。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<map> #include<queue> #include<cstring> #include<algorithm> #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rev(i,a,b) for(int i=(a);i>=(b);i--) #define clr(a,x) memset(a,x,sizeof a) #define inf 0x3f3f3f3f typedef long long LL; using namespace std; const int maxn=25; int n,m,rr,hr,ans,mmin[25]; void init() { mmin[0]=0;int cc=1; for(int i=1;i<23;i++) { mmin[i]=mmin[i-1]+i*i*(cc++); } } void dfs(int a,int b,int sum,int num,int place) { if(sum+a*a*b*(m-place)<n)return ; if(num>ans)return ; if(sum+mmin[m-place]>n)return ; if(place==m) { if(sum==n)ans=min(ans,num); return ; } for(int i=a-1;i>=m-place;i--) for(int j=b-1;j>=m-place;j--) { dfs(i,j,sum+j*i*i,num+2*i*j,place+1); } } int main() { init(); while(~scanf("%d%d",&n,&m)) { ans=inf; for(int j=m;j<=n;j++) for(int i=m;i<=sqrt(n/j);i++) dfs(i,j,j*i*i,i*i+2*i*j,1); if(ans!=inf)printf("%d\n",ans); else printf("0\n"); } return 0; }
poj 1190(dfs剪枝)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。