演算法分析之回溯法二

2021-09-01 06:34:00 字數 859 閱讀 3338

2.整數變換問題:整數i的兩種變換定義為,(向下取整);設計乙個演算法求給定兩個整數a和b,用最少次數的和變換將整數a變換為b;例如

題目分析:

觀察f和g兩個函式發現,f總是使得自變數x變大,g總是使得自變數x變小。因此我們在決定讓x執行哪個函式之前必須先判斷x和目標值m之間的大小關係。如果x>m,就讓其執行g函式;反之,執行f函式。

這道題目有兩種情況,一種是有解,即n可以通過函式變換成m;另一種是無解,即n無法通過函式變換成m。第一種情況比較容易,即只需要判斷最後的x是否等於m即可。如果x等於m,那麼說明n已經被變換成m了,遞迴返回。第二種情況,如果在遞迴的過程,出現了前面計算過的元素,那就說明n是無法轉換成m的。

用回溯法解決整數變換問題,用子集樹。

剪枝條件:

顯示約束:如果x>m,就剪掉它的左子樹;如果x隱式約束:如果在某次計算的過程中發現當前的計算次數已經大於或等於最少計算次數了,就剪掉這個分支。

具體**:

#include

int a,b;

int k,found;

int *p;

int f(int i)

int g(int i)

int changed(int m,int n)

}return 0;

}void compared()

}void main()

}else printf("%d 無法轉換成%d ",a,b);

演算法之回溯法

回溯法非常適合由多個步驟組成的問題,並且每個步驟都有多個選項。當我們在某一步選擇了其中乙個選項時,就進入下一步,然後面臨新選項,重複選擇,直至最終狀態。經典面試題1 矩陣中的路徑 詳見 劍指offer 面試題12 易錯點 1.由於路徑不能重複進入矩陣的格仔,因此還需定義和字元矩陣大小一樣的布林值矩陣...

演算法之回溯法

求解步驟 1,定義給定問題的解向量解空間 子集樹 排列樹 2,設計剪支函式 限界函式及約束函式 3,深度優先遍歷結合剪支得出解 求解過程 1,是否為完全解,是則輸出 2,是否為部分解,是則進行下乙個解分量的判斷 3,是否為當前可選集合中的最後乙個元素,是則回溯,重新判斷上乙個節點,否則判斷可選集合中...

常用演算法之回溯法

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