1690: CZY的组合数烦恼
时间限制: 3 Sec
内存限制: 128 MB
提交: 55
解决: 25
[提交][状态][讨论版]
题目描述
czy最近对组合数产生了浓厚的兴趣,一天他心血来潮,想排n个数字,但是很快他发现种类太多了,于是他决定从中随机找出m个数排,但还是太多了,所以他想请聪明的你写个程序帮助他找到所有种类的排列
输入
输入包括多组测试数据,每组包括一行整数n(1<=n<10),m(1<=m<=n),空格间隔
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
题目分析:
还是全排列问题就是在控制排列的方式不一样
点击这里 看看这个从小到大排列 和这个有什么区别 本博客另一个全排列问题可以参考一下
#include<cstdio>
#include<cstring>
#define INF 0xfffffff
int mark[20],a[20],arr[20];
int n,m;
void dfs(int v)
{
if(v>m) // 这里控制输出多少位
{
for(int i=1;i<=m;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
else
{
for(int i=n;i>=1;i--)
{
a[v]=i;// 和从小到大的主要区别就在这 那个是把这个放到if语句里面的 这个是先赋值后判断
if(!mark[i]&&a[v]<a[v-1])
{
mark[i]=1;
dfs(v+1);
mark[i]=0;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(mark,0,sizeof(mark));
a[0]=INF;
dfs(1);
}
return 0;
}