递归法:实现指数型枚举

问题:从1-n这n个整数中随机选取任意多个,输出所有可能选举方案
输入格式:输入一个整数n
输出方案:每行输出一种方案
同一行中的数必须升序排列,相邻两个数之间用空格隔开
对于没有任何数的方案,输出空行
数据范围:1<=n<=15
输入样例:3
输出样例:
3
2
2 3
1
1 2
1 3
1 2 3
在这里插入图片描述

#include<iostream>
using namespace std;
const int N=15;
int n;     //表示要输入的数字 
int st[N];   //记录当前状态,0表示不考虑,1表示 选它,2表示不选它 
int ways[1<<15][16],nub;   //用二维数组记录所有方案;nub表示当前方案数量的多少
void f(int k)   //k:指当前传到第几位了 
{
	if(k>n)     //判断边界,到达最后一位时,到达边界 
	   {
	  /* for(int i=1;i<n;i++)  //记录所有方案
	   if(st[i]==1)
	   ways[nub][i]=i;
	   nub++;*/
	   for(int i=1;i<=n;i++)
	   if(st[i]==1) //当前位置为1的时候表示选它, 
	   printf("%d",i); //输出结果 
	     printf("\n");
	      return;
	             }  
	    //分支节点  
st[k]=2;     //第一个分支 ,不选
f(k+1);  //递归到下一个位置 
st[k]=0;       //回溯,恢复到原来的状态 

st[k]=1;
f(k+1);    //第二个分支,选 
st[k]=0;      //回溯,恢复到原来的状态 

}
int main()
{
	cin>>n;
	f(0);    //传入当前枚举到第几类了 
	return 0;
	/*f(1);
	for(int i=0;i<nub;i++)
	{
	for(intj=1;j<n;j++)
	printf("%d",ways[i][j]);
	printf("%d");
	}*/
	return 0;
}

在这里插入图片描述

发布了65 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104318686