呵呵,這道題弄死我。。。
我覺得吧,凡事不能急於求成,比如這道經典的剪枝+搜尋,我就先查的題解,看了各種剪枝方法躊躇滿志,結果花了兩個小時寫的剪枝把自己都搞暈了。。。應該先有正確的搜尋方法再談剪枝不是嗎,所以我決定先用樸素的搜尋做一下
#include#includeint n, m;
int temp_s = 99999;
void search( int a, int r, int h, int v, int s);
int main(void)
void search( int a, int r, int h, int v, int s)
return;
} for( i = r - 1; i >= a; i--)
if( a == m) s = i * i;
search( a-1, i, j, v+i*i*j, s+2*i*j); // 這裡是作為新手的我一開始沒有想到的(事實上這裡的v,s隨i,j變化,所以作為引數傳遞很合理)
} }}
抱著僥倖的心理提交了一下,呵呵,果真超時了
好吧認命進行剪枝
根據 查的,初步確定以下幾個剪枝想法
#include#include#define min(a,b) (a > b ? b : a) // 這裡的寫法挺好的,免得再寫乙個函式了
int n, m;
int temp_s = 999999; // temp_s 設定乙個很大的值
int min_v[25], min_s[25];
void search( int a, int r, int h, int v, int s); // 搜尋函式
void minset( int m); // 求最小值函式
int main(void)
return 0;
}void minset( int m)
}void search( int a, int r, int h, int v, int s)
if( s + min_s[a-1] >= temp_s || v + min_v[a-1] > n || 2*(n-v)/r + s >= temp_s) return;
// 第乙個條件即判斷:若此次體積加最小體積大於標準體積,放棄這個分支
// 第三個條件即判斷:若剩餘體積所需的最小表面積加已有的表面積大於最優解,放棄這個分支。貌似沒有這個判斷就會超時
// 我覺得這個題的剪枝包括兩個方面,第乙個方面是對下乙個狀態進行判斷,第二個方面是對遠景狀態進行判斷,其中第二個方面能篩下去很多很多不必要分支
for( i = r - 1; i >= a; i--)
}}
【恩,頭乙個半自主完成的搜尋+剪枝題,雖然前前後後包括讀題和寫部落格總結花了我將近五個小時,超時wa了無數次,但是做完還是很高興的,ac的那一剎感覺那一切都值了】
POJ 1190 生日蛋糕
生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...
POJ 1190 生日蛋糕
time limit 1000ms memory limit 10000k total submissions 17060 accepted 6074 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為r...
poj 1190 生日蛋糕
time limit 1000ms memory limit 10000k total submissions 17460 accepted 6221 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為r...