从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤151≤n≤15
输入样例:
3
输出样例:
3 2 2 3 1 1 3 1 2 1 2 3
读题要认真,注意输出格式,注意无答案应输出什么
这是一个简单的暴力递归,当答案不多时可用数组记录答案,每一次递归结束后取消应该取消的标记。
思路:
1.枚举选值个数 1 ~ n,
2.每次递归我们需要维护三个信息,分别是可取的最小值(因为题目要求是上升的答案)x,共需要递归多少次 cas ,当前是第几次递归 sum。
3.递归出口:每递归一次会选出一个值,当递归次数比共需递归得次数多的时候( sum > cas )不再填空,输出答案并返回。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 35;
int n, vis[maxn], a[maxn];
void dfs(int x, int cas, int sum)
{
sum++;
if(sum > cas)
{
for(int i = 1; i <= cas; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(int i = x; i <= n; i++)
{
if(vis[i] != 1)
{
a[sum] = i;
vis[i] = 1;
dfs(i, cas, sum);
vis[i] = 0;
}
}
}
int main()
{
printf("\n");
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
dfs(1, i, 0);
}
return 0;
}