從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為下角標,...