位運算實現排列組合算法

排列數

#include <iostream>
#include <vector>
using namespace std;
int n;
int* a = new int[n];//實際中不要用動態數組
vector<int> path;
/**
 *@fuct 遞歸實現排列型枚舉
 *@param step遞歸深度 state狀態
 */
void dfs(int step, int state) {
	if (step == n) {
		for (auto x : path) cout << x << " ";
		cout << endl;
	}
	else {
		for (int i = 0; i < n; i++) {
			if (!(state >> i & 1)) {
				path.push_back(i + 1);
				dfs(step + 1, state | (1 << i));
				path.pop_back();
			}
		}
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		a[i - 1] = i;
	}
	dfs(0, 0);
	delete[] a;
	return 0;
}

組合數

#include <iostream>
using namespace std;
int n, m;
int* a = new int[n];//要組合的數據
/**
 *@fuct 遞歸實現組合型枚舉
 *@param step遞歸深度 sum選中的總數 state選擇的狀態
 */
void dfs(int step, int sum, int state) {
	if (sum + n - step < m) return;
	if (sum == m) {
		for (int i = 0; i < n; i++) {
			if (state >> i & 1) {
				cout << a[i] << " ";
			}
		}
		cout << endl;
		return;
	}
	dfs(step + 1, sum + 1, state | 1 << step);
	dfs(step + 1, sum, state);
}
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	dfs(0, 0, 0);
	delete[] a;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章