来源:POJ1190
神剪枝
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
const int INF=(~0U)>>1;
int ans;
int minv[30],mins[30];
void ini()
{
int i;
minv[0]=0;
mins[0]=0;
for(i=1;i<22;i++)
{
minv[i]=minv[i-1]+i*i*i;
mins[i]=mins[i-1]+2*i*i;
}
}
int get_v(int r,int h){
return r*r*h;
}
int get_s(int r,int h){
return 2*h*r;
}
void dfs(int floor,int v,int s,int posr,int posh){
//cout<<floor<<" "<<v<<" "<<s<<" "<<posr<<" "<<posh<<endl;
if(floor==0){
//cout<<"ans "<<ans<<endl;
//getchar();
if(v==0&&ans>s)
ans=s;
return ;
}
if(v-minv[floor-1]<0) return ;//$1
if(s>=ans) return ;//$2
if(2*v/posr+s>=ans) return ;//$3
for(int r=posr-1;r>=floor;r--){
int h;
h=min(posh-1,(v-minv[floor-1])/(r*r));
for(int j=h;j>=floor;j--){
if((v-r*r*j)>=0){
if(floor==m) s=r*r;//yuanpanchushizhi
s+=2*r*j;
dfs(floor-1,v-r*r*j,s,r,j);
s-=2*r*j;
if(floor==m) s=0;
}
}
}
}
int main(){
ini();
scanf("%d%d",&n,&m);
ans=0x3f3f3f3f;
dfs(m,n,0,1+n,1+n);
if(ans==0x3f3f3f3f)
ans=0;
cout<<ans<<endl;
return 0;
}