**算法思路:**n个数能够构成长度为1的组合、长度为2的组合、……、长度为n的组合。在求n个数的长度为m(m>=1 && m<=n)的组合时,我们把这n个数分成两部分:第一个数和其余的所有数。如果组合里包含第一个数,则下一步在剩余的数中选取m-1个数;如果组合里不包含第一个数,则下一步在剩余的n-1个数中选取m个数。这两个子问题都可以用递归的方式解决。
#include <iostream>
#include <vector>
using namespace std;
//求numbering中所有n个数字的组合,结果保存于result中
void combination_n(vector<int> numbering, int n, vector<vector<int>> &result) {
static vector<int> temp;
if (n == 0) {
result.push_back(temp);
}
else {
if (numbering.size()) {
temp.push_back(numbering[0]); //放numbering[0]
numbering.erase(numbering.begin());
combination_n(numbering, n - 1, result);
temp.pop_back(); //不放numbering[0]
combination_n(numbering, n, result);
}
}
}
vector<vector<int>> Get_n_combination(vector<int> numbering, int n) {
vector<vector<int>> result;
if (numbering.size() < n)
return result;
combination_n(numbering, n, result);
return result;
}
int main()
{
vector<int> cur{ 0,1,2,3 };
vector<vector<int>> result = Get_n_combination(cur, 3);
for (auto ite1 = result.begin(); ite1 != result.end(); ++ite1) {
for (auto ite2 = ite1->begin(); ite2 != ite1->end(); ++ite2) {
cout << *ite2 << " ";
}
cout << endl;
}
system("pause");
return 0;
}
运行结果: