求自然數的組合數的回溯演算法

2021-04-18 06:06:42 字數 1136 閱讀 7584

//自然數的組合數處理標頭檔案

//組合數的回溯演算法 /*

內容:完成組合數的回溯演算法

內容:完成二叉樹的前,中序遍歷(非遞迴)

內容:完成查詢二叉樹的靜,動態查詢(非遞迴) */

#include "stdlib.h"

#define  maxn 100

int number[maxn]; /*

自然數的組合數回溯演算法comb_back()

引數定義:

int m:  被求組合數的自然數

int n:  要求組合數的自然數個數

程式設計思想:(此分析以呼叫comb_back(5,3)為例)

採用回溯法處理組合數,將找到的組合以從小到大順序存入number[0],

number[1],...,number[n-1]中,組合的元素滿足如下關係式:

(1)  number[i+1] > number[i];

(2)  number[i]-i <= m -n+1;

首先,放棄組合數個數為n的條件,候選組合數從只有乙個數字1開始(設n=1)

因為,該候選組合滿足除問題規模之外的全部條件;

接著,擴大其規模,並使其滿足條件(1),候選組合改為1,2,繼續此過程,得到

候選組合1,2,3,該候選組合滿足包括問題規模在內的全部條件,因而得到乙個可

行的解;

在得到的解的基礎上,選下乙個候選解,試著調整組合中的最後乙個元素的值

為(4,5),得到1,2,4,及1,2,5兩個可行的解

《這就是試探》

; 當再試圖調整最後乙個元素發生越界時,就不能再做調整,此時,需要從最後

乙個元素回溯至其前乙個元素

《這就是回溯》

,然後向前試探得到可行解(1,3,4)及

(1,3,5);

重複上述向前試探和向後回溯,直到當需要從第乙個number[0]再回溯時,表

明已經找到問題的全部可行解,程式結束.

*/void comb_back(int m,int n)

i++; /*擴充套件,向前試探*/

number[i] = number[i-1]+1;

}

else /*不能試探,理應回溯*/

}while(1);

求自然數的組合數的回溯演算法

自然數的組合數處理標頭檔案 組合數的回溯演算法 內容 完成組合數的回溯演算法 內容 完成二叉樹的前,中序遍歷 非遞迴 內容 完成查詢二叉樹的靜,動態查詢 非遞迴 include stdlib.h define maxn 100 int number maxn 自然數的組合數回溯演算法comb bac...

求自然數的組合數的回溯演算法

自然數的組合數處理標頭檔案 組合數的回溯演算法 內容 完成組合數的回溯演算法 內容 完成二叉樹的前,中序遍歷 非遞迴 內容 完成查詢二叉樹的靜,動態查詢 非遞迴 include stdlib.h define maxn 100 int number maxn 自然數的組合數回溯演算法comb bac...

回溯遞迴 自然數的拆分

題目 自然數的拆分 任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。當n 7共14種拆分方法 7 1 1 1 1 1 1 1 7 1 1 1 1 1 2 7 1 1 1 1 3 7 1 1 1 2 2 7 1 1 1 4 7 1 1 2 3 7 1 1 5 7 1 2 2 2 7 1...