0
点赞
收藏
分享

微信扫一扫

hpu-1690-CZY的组合数烦恼



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;
}






举报

相关推荐

0 条评论