1190
这是关于搜素和剪枝的题目,做这类题目首先要确定剪枝的条件,不然就会超时了。
// 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; }