遞歸實現指數型枚舉

在這裏插入圖片描述
在這裏插入圖片描述

本題要求實現對n以內的整數進行排列組合(只選不排)。
實現思路就是對於當前第u位數(u <= n),分爲選與不選兩種情況,構成了一棵二叉選擇樹,最終的葉節點就是答案。
爲了節省空間和簡化操作,使用狀態壓縮,對於state,第i位爲1表示i這個數被選中。
#include<iostream>
using namespace std;
int n;
void dfs(int u, int state) {
	if (u == n) {
		for (int i = 0; i < n; i++) {
			if (state >> i & 1) {
				cout << i + 1 << " ";
			}
		}
		cout << endl;
		return;
	}

	dfs(u + 1, state);// 分支:不用這個數
	dfs(u + 1, state | 1 << u);//用這個數

}

int main() {
	cin >> n;
	dfs(0, 0);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章