题目描述
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; }