poj 1190 dfs
呃,感觉题意不是很明白,“由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 ”其实题意是说:所有的外表面+最下层的圆面积。(蛋糕从上往下俯视....只有一个最大的园面)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 8 #define inf 999999999 9 #define Min(x,y)(x>y?y:x) 10 int n,m,ans; 11 int minv[21],mins[21];//前i层最小值 12 13 void dfs(int v,int s,int floor,int r,int h) 14 { 15 if(floor==0) 16 { 17 if(v==n && ans>s) 18 ans=s; 19 return ; 20 } 21 if(v+minv[floor]>n || s+mins[floor]>ans || 2*(n-v)/r+s>=ans) 22 return ;//最小可能都大于所以退出,最后一个由(n-v)/r==r*h,s==2*r*h推出。smin=2*(n-v)/r; 23 int i,j,hh; 24 for(i=r-1;i>=floor;i--)//最小取floor,,因为接下来的floor层每层至少为1 25 { 26 if(floor==m) 27 s=i*i; 28 hh=Min(h-1,(n-v)/(i*i)); 29 for(j=hh;j>=floor;j--) 30 dfs(v+i*i*j,s+2*i*j,floor-1,i,j); 31 } 32 } 33 34 void init() 35 { 36 minv[0]=0; 37 mins[0]=0; 38 for(int i=1;i<=20;i++) 39 { 40 minv[i]=minv[i-1]+i*i*i; 41 mins[i]=mins[i-1]+2*i*i; 42 } 43 } 44 45 int main() 46 { 47 init(); 48 while(scanf("%d%d",&n,&m) != EOF) 49 { 50 ans=inf; 51 dfs(0,0,m,n+1,n+1); 52 if(ans==inf) 53 puts("0"); 54 else 55 printf("%d\n",ans); 56 57 } 58 return 0; 59 }