1. 程式人生 > >C++組合數(combination)的實現

C++組合數(combination)的實現

實現:

(nm)
  • 既需要計算組合的總數 (32)=3
  • 也需要分別獲得每一種組合的情形,用於窮舉搜尋;
    • 1, 2; 1, 3; 2, 3

1. 遞迴實現

// picked + toPick == m
void comb(int n, vector<int>& picked, int toPick){
    if (toPick == 0) { printPicked(picked); return; }
    int smallest = picked.empty() ? 0 : picked.back() + 1;
    for (int next = smallest; next < n; ++next){
        picked.push_back(next);
        comb(n, picked, toPick-1
); picked.pop_back(); // 關鍵!!! } }

對於 (42) 而言,四個之中選 2 個,呼叫端程式碼如下,

vector<int> picked;             // 開始為空;
comb(4, picked, 2);
                                // 第一個引數表示 n = 4,第三個引數表示 m=2

最終的輸出結果為:

0 1
0 2
0 3
1 2
1 3
2 3

也即,

  • 0 先進陣列,1 再進陣列 ⇒ toPick == 0, 輸出 (0, 1)
  • 1 出陣列,2 進陣列 ⇒ toPick == 0, 輸出 (0, 2)
  • 2 出陣列,3 進陣列 ⇒ toPick == 0, 輸出 (0, 3)
  • 3 出陣列,0 出陣列 ⇒ next ⇒ 1