POJ 1190 生日蛋糕題解

分類:技術 時間:2017-01-20

題目地址:http://poj.org/problem?id=1190

一道很有趣的搜索題……主要是剪枝……

我弄了5個剪枝:

1.當前剩余層數>=上層半徑,剪掉

2.當前剩余層數>=上層高度,剪掉

3.體積<1,剪掉

4.體積<當前可能的最小體積(我用等差數列求和公式算的……也不知道對不對)

5.神奇剪枝網上看的,當前(剩余體積*2)/上層半徑+當前表面積總和>當前搜出的最優解,剪掉

代碼很簡單,20行

 1 #include <iostream>
 2 #include <cmath>
 3 #include <climits>
 4 #define pow2(k) k*k
 5 #define v(r,h) pow2(r)*h
 6 #define min(a,b) a<b?a:b
 7 using namespace std;
 8 int n,m,s=INT_MAX,beg;
 9 void dfs(int r,int h,int c,int lv,int ans)
10 {
11     if(c>m){if(!lv)s=min(s,ans);return;}if(r<=m-c+1||h<=m-c+1||ans+lv*2/r>s||lv<1||lv<(m-c+2)*(m-c+1)/2)return;
12     for(int i=r-1;i>0;i--)for(int j=1;j<h&&v(i,j)<=lv;j++)dfs(i,j,c+1,lv-v(i,j),ans+2*i*j);
13 }
14 int main()
15 {
16     ios::sync_with_stdio(0);
17     cin>>n>>m,beg=sqrt(n)+1;
18     for(int i=beg;i>=1;i--)for(int j=1;v(i,j)<=n;j++)dfs(i,j,2,n-v(i,j),pow2(i)+2*i*j);
19     cout<<(s==INT_MAX?0:s);
20     return 0;
21 }


Tags: 搜索

文章來源:


ads
ads

相關文章
ads

相關文章

ad