描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
-
输入
- 输入n、r。 输出
-
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
-
5 3
样例输出
-
543 542 541 532 531 521 432 431 421
-
321
-
这道题用深搜,是最基础的一道,
-
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int a[15];
bool b[15];
void dfs(int p)
{
if(p>1&&a[p-1]>a[p-2])//剪枝部分,实现从大到小排序
return ;
if(p==m)
{
for(int i=0; i<m; i++)
printf("%d",a[i]);
printf("\n");
return ;
}
for(int i=n; i>=1; i--)
{
if(b[i]==0)//避免重复出现一个数,例如555
{
a[p]=i;
b[i]=1;
dfs(p+1);
b[i]=0;
}
}
}
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d",&n,&m);
dfs(0);
}