http://poj.org/problem?id=1190
分析:这真是各种剪枝啊,我的数学你在哪里……
#include <iostream>
#include <cstring>
using namespace std;
const int MAX=0xfffffff;
int mmins;
int V,M;
int Get_minV(int x){
return (x+1)*(x+1)*x*x/4;
}
/* V=PI*r^2*h;
S(侧)=2*PI*r*h;
S=2*V/r */
void DFS(int level,int leftv,int s,int r,int h)
{
if(s+2*leftv/r>=mmins) return; //剩余的体积能够获得最小的表面积
if(leftv<Get_minV(level)) return; //现在最少能够形成的体积
if(level==0){
if(leftv==0) mmins=s;
return;
}
for(int i=r-1;i>=level;i--){
int t=i*i;
if(level==M) s=t; //第1层
for(int j=h-1;j>=level;j--){
DFS(level-1,leftv-t*j,s+2*i*j,i,j);
}
}
}
int main()
{
while(cin>>V){
cin>>M;
mmins=MAX;
DFS(M,V,0,100,10000);
if(mmins!=MAX) cout<<mmins<<endl;
else cout<<0<<endl;
}
return 0;
}