真的剪枝会提高很多的效率,虽然剪的时候可能计算的步骤比较多。不过这只是倍数的增加。换来的是指数的减少。

还有就是要注意边界条件。


#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