以前研究過乙個簡單的n皇后問題,對回溯法也有了個模糊的認識,大致理解就是:先一直做某件事,當完成某個條件時或者是觸犯某個條件時,再返回到最近的乙個類似還原點的地方。
在用回溯法求解0-1揹包問題的時候,主要遇到三個相對難解決的問題:1,什麼是界限函式;2,什麼時候用它;3,回溯到哪兒。
什麼是界限函式?
如下圖:
從下圖中的偽**可以看出,我們計算後半段最大價值的時候,使用的還是乙個貪心演算法,雖然分割的情況是不被允許的,但是我們可以用這個結果來進行估算。
回溯法得到的搜尋空間樹:
什麼時候使用界限函式?
數學一點兒的說法是:當x[i]=0時。
通俗一點說:當進入右結點的時候。
如何回溯的問題?
向上回溯到第乙個不是0的結點(並且這個結點不是頂點)。
求解思路
但我們回溯到x[1]的時候,我們將x[1]置0,這時候用界限函式估算下物品2到物品8可能獲得的最大價值,發現是155.11,比我們實際得到的最大解159還小,然後果斷放棄,再向上回溯,發現這已經到了盡頭了,然後停止。
結合以前的n皇后問題,n皇后問題是我一行一行的放皇后,如果當下一行放到最後乙個位置的時候還是會產生攻擊,這時候我們就調整上一行皇后的位置,然後再回到本行從第乙個開始放。對比0-1揹包,這個是完成一次求解過程,然後就回溯繼續求解。
所以,回溯法是先一直做,做不下去了,然後才向回走。
小結:0-1揹包問題的用回溯法解決最開始提出的三個問題挺關鍵的,試想,如果乙個問題足夠大的話,用界限函式能夠砍掉很多不合條件的子節點,極大的提高了效率。
回溯法求解01揹包問題
在前面文章我們使用動態規劃求解了揹包問題,時間複雜度是o cn 當我們的c的值非常大的時候,說消耗的時間也是非常大的!接下來我們就使用回溯法來求解這個問題,其時間複雜度為o n2n 這個結果當我們的c的值是小於2n 的時候,該演算法所需的時間是小於動態規劃的!既然使用了回溯法,我們就的構造解析樹,因...
回溯法求解0 1揹包問題
include using namespace std struct dot void getvalue int weight,int value void calculate int weight,int value else while deep 6 else int main 選擇第1個 當前...
0 1揹包問題 回溯法求解
0 1揹包問題 物品總數n,每個物品的體積w i 價值v i 給定揹包的總容量w,求放入揹包中物品的最大價值。用回溯法對0 1揹包問題進行求解,具體思路是 1.使用解空間進行標記每個物品的放入情況,即要建立乙個陣列進行儲存其是否放入,可使用 bool x i 進行標識 2.回溯法第一感覺上是窮舉所有...