真的剪枝会提高很多的效率,虽然剪的时候可能计算的步骤比较多。不过这只是倍数的增加。换来的是指数的减少。
还有就是要注意边界条件。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define inf 1e9
int n,m;
int ans;
void dfs(int r,int h,int step,int v,int s)
{
// cout<<r<<' '<<h<<' '<<step<<' '<<v<<' '<<s<<endl;
if (step==m)
{
if (v==n)
{
ans=min(ans,s);
// cout<<r<<' '<<h<<endl;
}
return;
}
int big,small,ss;
for (int i=r-1;i>=m-step;i--)
{
for (int j=h-1;j>=m-step;j--)
{
ss=step==0?i*i:0;
ss+=i*2*j;
big=small=i*i*j;
int cur=m-step-1;
int ii=i-1,jj=j-1;
while (cur)
{
big+=ii*ii*jj;
small+=cur*cur*cur;
ss+=cur*2*cur;
ii--;
jj--;
cur--;
}
// cout<<i<<' '<<j<<endl;
if (big+v>=n && small+v<=n && ss+s<ans)
{
if (step==0)
dfs(i,j,step+1,i*i*j,i*i+i*2*j);
else
dfs(i,j,step+1,v+i*i*j,s+i*2*j);
}
}
}
}
int main()
{
freopen ("in.txt","r",stdin);
int i,j,k;
while (cin>>n>>m)
{
ans=inf;
k=(int)sqrt((float)n);
dfs(k+1, n/m+1, 0, 0 , 0);
if (ans==inf)
cout<<0<<endl;
else
cout<<ans<<endl;
}
return 0;
}
1670