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/archive/2012/09/30/2709298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值