递推实现指数型枚举--算法竞赛进阶指南

从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式
输入一个整数n。

输出格式
每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围
1≤n≤15
输入样例
3
输出样例

3
2
2 3
1
1 3
1 2
1 2 3

/*
主要思想:任意选择多个,那么我们只需要判断这个数字是否选择即可 
*/ 

#include <iostream>

using namespace std;

int nums[16];//0-代表这个数字不用,1-代表这个数字用了 
int n;
void dfs(int index)//决定index这个数字是否使用 
{
	//index == n,代表已经判断到最后一个位置了 
	if(index == n)
	{
		for(int i = 0; i < n; i++)
		{
			if(nums[i] == 1)
				cout << i+1 << " ";
		}
		cout << endl;
		return;
	}
	nums[index] = 1;//这个数字使用
	dfs(index+1);//去判断下一个数字 
	nums[index] = 0;//这个数字不使用
	dfs(index+1);
}

int main()
{
	cin >> n;
	dfs(0);
	return 0;
}
/*
主要思想:用2进制数字代表这个数字是否取用0代表不取用,1代表取用
则是输出所有2进制数所有可能 
*/

#include <iostream>
#include <cmath>

using namespace std;
int main()
{
	double n;
	cin >> n;
	int c = pow(2,n);//计算出对应的十进制数字 
	for(int i = 0; i < c; i++)//遍历十进制,即遍历所有二进制
	{
		//取出第j位置上是1还是0 
		for(int j = 0; j < n; j++)
		{
			if((i >> j&1) == 1)//为1,代表取用 
			{
				cout << j+1 << " ";
			}
		}
		cout << endl;
	} 
	return 0;
} 
发布了36 篇原创文章 · 获赞 47 · 访问量 3973

猜你喜欢

转载自blog.csdn.net/qq_43800455/article/details/104648514