这是关于搜素和剪枝的题目,做这类题目首先要确定剪枝的条件,不然就会超时了。
// 1190.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
int mins=10000000,lever,n,m;
int n3(int x)
{
return (x+1)*(x+1)*x*x/4;
}
void f(int leftv,int floor,int lastr,int lasth,int s)
{
if(s+2*leftv/lastr>=mins)
return;
if(leftv<n3(floor))
return;
if(floor==0)
{
if(leftv==0)
mins=s;
return;
}
int r,h,r2,maxh;
for(r=lastr-1;r>=floor;r--)
{
r2=r*r;
if(floor==m)
s=r2;
maxh=(leftv-n3(floor-1)/r2);
if(maxh>lasth-1)
maxh=lasth-1;
for(h=maxh;h>=floor;h--)
f(leftv-r2*h,floor-1,r,h,s+2*r*h);
}
}
int main()
{
cin>>n>>m;
int sum=0;
f(n,m,101,1000,0);
if(mins>100000000)
cout<<0;
else
cout<<mins<<endl;
system("pause");
return 0;
}