C++組合數(combination)的實現
阿新 • • 發佈:2019-01-29
實現:
- 既需要計算組合的總數
(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();
// 關鍵!!!
}
}
對於
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
- …