遞迴列舉排列組合

2021-10-24 11:16:18 字數 1606 閱讀 4932

從1~n這n(n<20)個整數中隨機取出任意多個,輸出所有的可能選擇方案。(2的n次方種)

思路:使用遞迴實現,每次遞迴分別嘗試對每乙個數進行或者不選的操作,尚未確定的整數數量減少1.

vector<

int>chosen;

class

solution

calc

(x +

1,n, result)

; chosen.

push_back

(x);

calc

(x +

1, n, result)

; chosen.

pop_back()

;}vectorint>>

combine

(int n)

};

從1~n這n(n<20)個整數中隨機取出k個(0 <= k <= n <= 20),輸出所有的可能選擇方案。()

只需要在上面指數列舉的程式calc函式開頭新增一下這條語句即可:

if (chosen.size() > k || chosen.size() + (n - x + 1) < k) return;
這就是所謂的剪枝。尋找變換路線其實就是「搜尋」的過程,如果能及時確認當前問題一定是無解的,就不需要到達問題邊界菜返回結果了。如果選擇了k個數,或者即使再選上剩餘所有的數也不夠k個,就可以提前得知當前問題無解。這樣就把時間複雜度從2的n次方到\gamma(z) = cmn。

vector<

int>chosen;

class

solution

result.

push_back

(lev)

; cout << endl;

return;}

calc

(x +

1,n,k, result)

; chosen.

push_back

(x);

calc

(x +

1, n, k, result)

; chosen.

pop_back()

;}vectorint>>

combine

(int n,

int k)

};

從1~n這n(n<20)個整數排成一行後隨機打亂順序,輸出所有的可能選擇方案。(n!中)

思路:遞迴需求解的問題是「把指定的n個整數按照任意次序排序」,在每一次遞迴中,嘗試把每個可用的數作為數列中的下乙個數,求解「把剩餘的n-1個整數按照任意的次序排列」這個規模更小的子問題了。

int chosen[20]

;int order[20]

;class

solution

for(

int i =

1; i <= n; i++)}

vectorint>>

combine

(int n)

private

:int count =0;

};

遞迴實現排列組合

置換 給定n大於等於1個元素的集合,列印這個集合所有可能的置換。我們通過觀察集合,得到生成所有置換的簡單演算法,以下是演算法的構造過程 1 a跟在 b,c,d 的所有置換之後。2 b跟在 a,c,d 的所有置換之後。3 c跟在 a,b,d 的所有置換之後。4 d跟在 a,b,c 的所有置換之後。in...

排列 組合 遞迴 搜尋

1 給乙個字串,輸出它的全排列 思想 遞迴,先考慮第乙個位置能出現的所有字元,然後遞迴考慮第二個位置能出現的字元.include include includeusing namespace std void permutation char pstr,char pbegin int main 用模...

排列組合及遞迴

置換 substitution 將n個事物按順序進行排列,記作p n為上下角標 n!排列 permutation 從n個事物中取出一部分進行排列,記作p n為下角標,k為上角標 n n 1 n k 1 n!n k 組合 combination 不考慮順序 先順序計數,再除重複度 記作c n為下角標,...