POJ 1190 生日蛋糕(DFS 剪枝)

2021-07-31 12:03:54 字數 998 閱讀 6817

本題是一道dfs+剪枝的經典例題,詳情請看**注釋,裡面按照我個人的理解進行了詳細的解釋

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n, m;

int minv[30], mina[30];

int area = 0;

int mina = 1

<< 30;

//求在剩餘n層,底面最大半徑為r,高度最大為h的情況下,能湊出的最大體積

int maxv(int n, int r, int h)

return v;

}//用n層去湊剩餘體積v,這n層中最大半徑為r,高度最大為h

void dfs(int v, int n, int r, int h)

}if (v <= 0) return;//發現無剩餘體積則退出

if (minv[n] > v) return;//前n層最小的體積一定會超過剩餘體積時退出

if (area + mina[n] >= mina) return;//前n層最小表面積與當前面積和已超過當前最優解時退出

if (h < n || r < n) return;//高度、半徑已不夠安排時退出

if (maxv(n, r, h) < v) return;//當前狀態最大體積也達不到剩餘體積

for (int i = r;i >= n;i--)

}}int main()

if (minv[m] > n)//m層的最小體積大於給定體積時輸出無解(0)

else

}return

0;}

POJ 1190 生日蛋糕

生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...

POJ 1190 生日蛋糕

呵呵,這道題弄死我。我覺得吧,凡事不能急於求成,比如這道經典的剪枝 搜尋,我就先查的題解,看了各種剪枝方法躊躇滿志,結果花了兩個小時寫的剪枝把自己都搞暈了。應該先有正確的搜尋方法再談剪枝不是嗎,所以我決定先用樸素的搜尋做一下 include includeint n,m int temp s 999...

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...