1. 程式人生 > 其它 >Acwing 92.遞迴實現指數型列舉

Acwing 92.遞迴實現指數型列舉

連結:https://www.acwing.com/problem/content/94/
題目
從 1∼n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式
輸入一個整數 n。

輸出格式
每行輸出一種方案。

同一行內的數必須升序排列,相鄰兩個數用恰好 1 個空格隔開。

對於沒有選任何數的方案,輸出空行。

本題有自定義校驗器(SPJ),各行(不同方案)之間的順序任意。

資料範圍
1≤n≤15
輸入樣例:
3
輸出樣例:
3
2
2 3
1
1 3
1 2
1 2 3

思路:
對於整數n,從1到n,每個數都有選或者不選兩種可能,所以總共的方案數=2^n
可以建立一個數組,保留每一位的選擇,1表示選這個數,2表示不選這個數
題解

#include<bits/stdc++.h>
using namespace std;
const int N=16;
int n;
int ans[N];  //保留結果的陣列,0表示未選擇,1表示選這個數,2表示不選這個數 

void dfs(int u)
{
	if(u>n)
	{
		for(int i=1;i<=n;i++)
			if(ans[i]==1) cout<<i<<' ';
		cout<<endl;
		return ;
	}
	ans[u]=1;	//第一個分支,選它 
	dfs(u+1);
	ans[u]=0;   //恢復現場 
	
	ans[u]=2;	//第二個分支,不選它 
	dfs(u+1);
	ans[u]=0;   //恢復現場 
}

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