1. 程式人生 > >演算法 第五章作業

演算法 第五章作業

1.對回溯演算法的理解

回溯演算法主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回(也就是遞迴返回),嘗試別的路徑。回溯法一般用遞迴來解決。回溯法中通過構造約束函式,大大地提升程式效率,因為在深度優先搜尋的過程中,不斷的將每個解與約束函式進行對照從而刪除一些不可能的解,這樣就不必繼續把解的剩餘部分列出從而節省部分時間。

回溯演算法的編寫:1.根據題目條件確定解空間

                             2.確定解空間結構

                             3.以深度優先的策略進行搜尋,並確定約束函式以刪除一些不可能的解

2.說明“子集和”的解空間結構和約束函式

解空間結構:

if(sum + a[t] <= c)//左樹剪枝
    {
        x[t] = 1 ;
        sum = sum+a[t] ;
        if ( backtrack(t+1) )
            return
true; sum -= a[t]; } if( sum + rest >= c) //右樹剪枝 { x[t] = 0 ; if ( backtrack(t+1) ) return true; }

約束函式:首先是對左樹進行剪枝,即走1與否的剪枝,判斷方法為目前的和sum加上當前的a[t]是否大於給定的值,大於的話則不是1;然後是對右樹進行剪枝,即走0與否的剪枝,判斷方法主要是有一個變數rest表示數列a從t+1開始至後面所有剩下的元素之和,如果目前的和sum加上這個rest小於給定的值,則不是0.

3.本章遇到的問題和結對程式設計的情況

本章主要學習的是回溯法,針對回溯法最重要的是剪枝的策略,在結對的過程中,我和隊友剛開始都比較難理解怎麼剪枝,對剪枝的方法還不熟練,後來認真回看了老師上節課的PPT還有別的同學的指導下比較順利地完成了作業和實驗。