求一组数的所有位数为n的组合

**算法思路:**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;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_25800311/article/details/82049890