全排列的演算法(六) 回溯法

2021-06-28 19:24:09 字數 985 閱讀 8954

全排列的生成演算法(六)——回溯法

回溯法通常是構造一顆生成樹。以3

個元素為例;樹的節點資料可取值是1、

2、3。如果某個節點為

0,則表示尚未取值。

初始狀態是(0,0

,0),第1

個元素值可以分別挑選1,

2,3,因此擴充套件出

3個子結點。用相同方法找出這些結點的第

2個元素的可能值,如此反覆進行,一旦出現新結點的

3個資料全非零,那就找到了一種全排列方案。當嘗試了所有可能方案,即獲得了問題的解答。

回溯法有非遞迴和遞迴兩種形式。遞迴形式的程式**比較簡潔,但是遞迴會帶來執行時間和記憶體的額外消耗,效率較低。非遞迴形式的回溯法效率要高一些,但程式**比較複雜。

//回溯(非遞迴)

//輸入:排列元素個數n

//輸出:

n個元素的全體排列

#include

#include

using namespace std;

void output(int *,int);

void backdate(int *,int);

int total;

int main(void)

return 0;

} void backdate(int *p,int n)

j++;                        //換乙個

}if(i==n)                          //如果排列的那個元素都已選定

if(j>n)                            //當j超出可取值範圍}}

void output(int *p,int n)

return 0;

}void backdate(int *p,int n,int k)}}

void output(int *p,int n)

{cout

六 回溯演算法

基本思想 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇。滿足回溯條件的某個狀態的點...

實驗六 回溯演算法 二)

一 實驗目的與要求 1 熟悉0 1問題 2 掌握回溯演算法 3 能對設計的演算法進行複雜度分析。二 實驗題目 0 1揹包問題。給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?在選擇物品裝入揹包 時,對每種物品只有兩種...

演算法入門(4) 回溯法

1 概念 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術...