什么都不说了 貌似别人分类是简单题..自己照着别人的代码写的 自己写的tle了 简单的剪枝 效果这么明显................... 开始自己还求了j的下限 结果还不如不求了 直接j>=depth的效果要好很多 #include<iostream> #include<fstream> #include<math.h> #include<cstdio> using namespace std; #define INF 999999 int v; int level; int area; int min_res; #define N 10004 int mins[30]; int minv[30]; void solve(int val,int depth,int ,int); int main() { mins[0] = 1; minv[0] = 0; for (int i = 1; i < 21; i++) { //所有的最小面积 mins[i] = mins[i - 1] + 2 * i * i; //所有的最小体积 minv[i] = minv[i - 1] + i * i * i; } min_res=INF; cin>>v>>level; int r=(int)(v/level); solve(v,level,r,INF); if(min_res!=INF) cout<<min_res<<endl; else cout<<0<<endl; } void solve(int val,int depth,int r,int h) { if(val<0) return ; if(depth==0) { if(val==0&&area<min_res) { min_res=area; } return ; } if(area+2*val/r>min_res) return; if(area+mins[depth]>min_res) return ; if(minv[depth]>val) return; int remain; for(int i=r-1;i>=depth;i--) { int t=i*i; int j=(val-minv[depth-1]) /t; j=min(j,h-1); for(j;j>=depth;j--) { if(depth==level) area=t; area+=2*i*j; remain=val-t*j; solve(remain,depth-1,i,j); area-=2*i*j; } } }