B - 组合数
给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。
Input
第一行是一个整数T,代表T组测试数据。
接下来T行,每行是两个正整数n(1<=n<=10), k(1<=k<=n)。
Output
对于每组数据按字典序输出所有符合条件的子集。
Sample Input
1
5 3
Sample Output
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
#include<stdio.h>
int n,book[10],a[11]={0},m;
void dfs(int num)
{
int i;
if(num==m+1)
{
for(i=1;i<m;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[m]);
}
for(i=1;i<=n;i++)
{
if(!book[i]&&i>a[num-1])
{
a[num]=i;
book[i]=1;
dfs(num+1);
book[i]=0;
}
}
return ;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
dfs(1);//将1调用到调用函数中
}
return 0;
}
组合数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
找出从自然数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>
int n,book[10],a[11]={21},m;
void dfs(int num)
{
int i;
if(num==m+1)
{
for(i=1;i<=m;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
for(i=n; i>=1; i--) //改变顺序,组合之间按逆字典序排列。
{
if(!book[i]&&i<a[num-1]) //增加条件,每一个组合中的值从大到小排列
{
a[num]=i;
book[i]=1;
dfs(num+1);
book[i]=0;
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1);
return 0;
}