導入
5 12,345の数を想定している、数3は、要求の組み合わせから選択されます。あなたは、次のアイデアを考えることができます
- 再帰的な手順である2345年2の要求を選択された組合せ、の誕生から、選択する1
- 2 3 4 5を選択し、要求の組合せから選択する2、再帰的なプロセスはまだあります
- 2 45から選択された組み合わせを求めて、3を選択
- 4出会い、数字の残りの部分はそれほど考慮し続けていない、2を選択することはできません、唯一のものです
再帰的定義_comb(アレイ、訪問、INT L 、int型k)を
再帰的プロセス訪問選択印であり、Lはカラム開始インデックスの数であり、kは数を取ることが要求されます
コード
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
void _comb(vector <int> &array, vector <int> &visit, vector <vector <int>> &result, int l, int k)
{
visit[l] = 1;
if(k == 1) {
vector <int> tmp;
for(int i=0; i<visit.size(); i++) {
if(visit[i]) {
tmp.push_back(array[i]);
}
}
result.push_back(tmp);
visit[l] = 0;
return;
}
for(int i=l+1; i<array.size() && (l+k) <= array.size(); i++) {
_comb(array, visit, result, i, k-1);
}
visit[l] = 0;
}
void comb(vector <int> &array, vector <vector <int>> &result, int k)
{
int n = array.size();
vector <int> visit;
visit.resize(n);
for(int i=0; i<n; i++) {
visit[i] = 0;
}
for(int i=0; i<n; i++) {
_comb(array, visit, result, i, k);
}
}
int main(void)
{
vector <int> array;
vector <vector <int>> result;
for(int i=0; i<5; i++) {
array.push_back(i+1);
}
comb(array, result, 2);
for(int i=0; i<result.size(); i++) {
for(int j=0; j<result[i].size(); j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}