C++ 求排列组合

在笔试面试中经常会遇到求排列组合的题目(或者需求),现在将它们做一个总结。

1.排列数公式与组合数公式

formula

2.思路

参考程序员面试宝典P112,求9位数能被整除的问题(具体请自己去看书),实际上的思路就是利用一个bool型数组记录被占用的位置,DFS求解。这里想指出STL有next_permutation方法。

vector<string> res;
void dfs(int pos, int count, int n, int k, vector<char> data, vector<bool> isUsed)
{
	if (count == k) {
		string tmp;
		for (int i = 0; i < n; i++) {
			if (isUsed[i] == true)
				tmp.push_back(data[i]);
		}
		res.push_back(tmp);
		return;
	}
	if (pos == n)
		return;
	if (isUsed[pos] == false) {
		isUsed[pos] = true;
		dfs(pos + 1, count + 1, n, k, data, isUsed);
		isUsed[pos] = false;
	}
	dfs(pos + 1, count, n, k, data, isUsed);
	
}
vector<string> res2;
void Perm(int start, int end, vector<char> data) {
	if (start == end) {
		string tmp;
		for (int i = 0; i < end; i++)
			tmp.push_back(data[i]);
		res2.push_back(tmp);
		return;
	}
	for (int i = start; i < end; i++) {
		swap(data[start], data[i]);      
		Perm(start + 1, end, data);   
		swap(data[i], data[start]);     
	}
}
int main() {

	vector<char> data{ 'a','b','c','h' };
	vector<bool> isUsed(data.size(), false);
	int n = data.size(); int k; cin >> k;
	dfs(0, 0, n, k, data, isUsed);
	do {
		for (vector<char>::iterator it = data.begin(); it!= data.end();it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	} while (next_permutation(data.begin(), data.end()));
	Perm(0, n, data);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_21602549/article/details/82355915