算法进阶指南(递归)--- 递归实现指数型枚举

题目链接:递归实现指数型枚举

普通版:

#include <iostream>
using namespace std;

int n;
int a[20];
bool vis[20];

// 当前枚举到第pos个坑, 上一个坑填的是start-1,这次只能从start开始找数填, 一共要填tar个坑
void dfs(int pos, int start, int tar) {
	if(pos == tar+1) {
		for(int i = 1; i <= tar; i++) cout<<a[i]<<" ";
		cout<<endl;
		return ;
	}
	for(int i = start; i <= n; i++) {
		vis[i]=true;
		a[pos]=i;
		dfs(pos+1,i+1,tar);
		vis[i]=false;
	}

}

int main() {
	cout << endl;
	cin >> n;
	for (int i = 1; i <= n; i ++ )
		dfs(1, 1, i);
	return 0;
}

动态数组版:

#include<iostream>
#include<vector>

using namespace std;


int n;
vector<int > chosen;

void dfs(int x) {
	if(x == n+1) {
		for(int i=0; i<chosen.size(); i++) {
			cout<<chosen[i]<<" ";
		}
		puts("");
		return ;
	}
	//不选择x这个值
	dfs(x+1);

	//选择x这个值
	chosen.push_back(x);
	dfs(x+1);
	chosen.pop_back();

}
int main() {
	cin >> n;
	dfs(1);
	return 0;
}

位运算版:

#include<iostream>

using namespace std;


int n;

//pos是当前枚举的这个数,tar是记录哪些值被选
void dfs(int pos,int tar) {

	if(pos == n) {
		for(int i = 0; i<n; i++) {
			if(tar>>i&1) cout<<i+1<<" ";
		}
		cout<<"\n";
		return ;
	}
	//不选择pos这个值
	dfs(pos+1,tar);
	//选择pos这个值
	dfs(pos+1,tar|(1 << pos));

}
int main() {
	cin >> n;
	dfs(0,0);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/bingers/p/13192248.html