递归法:实现指数型枚举(二叉树递归)

本文介绍了一种从1到n的整数中随机选取任意多个整数的所有可能方案的算法实现。通过递归和回溯的方法,确保了输出的每种方案中数字的升序排列,适用于数据范围为1≤n≤15的情况。

问题:从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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值