整數變換問題:整數i的兩種變換定義為f(i)=3i,g(i)=i/2(向下取整);設計乙個演算法求給定兩個整數a和b,用最少次數的a和b變換將整數a變換為b;例如4=gfgg(15).
題目分析:
觀察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);
printf("\n");
}結果截圖:
整數變換問題 回溯法
整數變換問題 關於整數i 的變換f 和g 定義如下 f i 3i g i i 2。試設計乙個演算法,對於給定的2 個整數n 和m,用最少的f 和g 變換次數將n 變換為m。例如,可以將整數15 用4 次變換將它變換為整數4 4 gfgg 15 當整數n 不可能變換為整數m 時,演算法應如何處理?這是...
整數變換問題 (回溯法)
整數變換問題 time limit 1000 ms memory limit 65536 kib problem description 整數變換問題。關於整數i的變換f和g定義如下 f i 3i 試設計乙個演算法,對於給定的2 個整數n和m,用最少的f和g變換次數將n變換為m。例如,可以將整數15...
整數變換問題 回溯演算法 C
問題描述 整數i的兩種變換定義為 f i 3i,g i i 2 向下取整 設計乙個演算法求給定兩個整數n和m,用最少次數的f 和 g變換將整數n變換為m 例如 可以將整數15通過4次變換將它變成4,4 gfgg 15 當整數n不可能轉換為m時,演算法應當怎麼處理。本題是當出現重複數字,認為無法轉換。...