您的位置:首页 > 其它

poj 1190 生日蛋糕 剪枝dfs

2013-04-14 19:38 197 查看
两个可行性剪枝 if(i*i*j*m

int tmp=0,p=1;

for(int k=1;k<=m;k++)

{

tmp+=p*p*p;

p++;

}

if(tmp>n) continue;

一个最优化剪枝 if(2*n/i+s>=ans) continue;

#include <iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

using namespace std;

const int inf=999999;

int ans=inf;

int M;

int dfs(int r,int h,int n,int m,int s)

{

for(int
i=r-1;i>=1;i--)

for(int
j=h-1;j>=1;j--)

if(i*i*j<=n)

{

if(m==1)

{

int
tmp=0;

if(m==M)
tmp=i*i;

if(i*i*j!=n) continue;

if(s+2*i*j+tmp<ans)
ans=s+2*i*j+tmp;

continue;

}

if(i*i*j*m<n) continue;

{

int
tmp=0,p=1;

for(int
k=1;k<=m;k++)

{

tmp+=p*p*p;

p++;

}

if(tmp>n) continue;

}

if(m!=M)

{

if(2*n/i+s>=ans) continue;

}

int tmp=0;

if(m==M) tmp=i*i;

dfs(i,j,n-i*i*j,m-1,s+tmp+2*i*j);

}

return(0);

}

int main()

{

int n,m;

scanf("%d
%d",&n,&m);

M=m;

int r=sqrt(n/m)+1;

int h=n/m/m+1;

dfs(r,h,n,m,0);

if(ans!=inf)

printf("%d\n",ans);

else

printf("0\n");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: