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 }
原文地址:https://www.cnblogs.com/Missa/p/2709298.html