码迷,mamicode.com
首页 > 其他好文 > 详细

组合数 南阳oj32【DFS】

时间:2015-08-10 12:06:25      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

描述
找出从自然数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>
int m,n;
int vis[20];
int res[20];
int arr[20];
void DFS(int a,int b,int step)
{
	if(a>m+1) return ;
	if(step==n+1)
	{
		for(int i=1;i<n;++i)
			printf("%d",res[i]);
		printf("%d\n",res[n]);
		return ;
	}
	res[b]=arr[a];
	DFS(a+1,b+1,step+1);
	
	DFS(a+1,b,step);
}
int main()
{
	while(~scanf("%d%d",&m,&n))
	{
		int j=0;
		for(int i=m;i>=1;--i)
		{
			arr[++j]=i;
		}	
		DFS(1,1,1);
	}
	return 0;
}



#include <stdio.h>
#include<string.h>
int m,n;
int vis[20];
int res[20]={100};
void DFS(int step)
{
	if(step==n+1)
	{
		for(int i=1;i<n;++i)
			printf("%d",res[i]);
		printf("%d\n",res[n]);
	}
	for(int i=m;i>=1;--i)
	{		
		if(!vis[i]&&i<res[step-1])
		{
			res[step]=i;
			vis[i]=1;
			DFS(step+1);
			vis[i]=0;
		}
		
	}
}
int main()
{
	while(~scanf("%d%d",&m,&n))
	{
		memset(vis,0,sizeof(vis));
		DFS(1);
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

组合数 南阳oj32【DFS】

标签:

原文地址:http://blog.csdn.net/yuzhiwei1995/article/details/47395575

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!