组合排列问题(A(n,m))

组合排列问题:复杂度为O(m*n)实现原理:递归,这种做法有点类似于遍历,就是k不断从1增长到m,每一个p(k)又从a[1]到a[n]中去遍历。其实在复杂度上面递归并没有提升效率,和双重循环递推一样的。但是更易于理解,可读性强,代码少。看下一张图可能能加深理解(红色的m改成n,写错了)。

/* 	全排列问题 
	从n中选m个数按照字典排序 
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
int s=0;int m,n;int a[100];
using namespace std;
int main()
{
	int P(int k);   //k从 1 一直增长到 m ,k表示排列的第k个数 
	cin>>n>>m;
	P(1);
	return 0;
}


int P(int k)
{
	if(k>m)   //如果 k 要比m还要长则停止递归 
	return s;
	
	for(int i=1;i<=n;i++)
	{
		a[k]=i;
		int flag=0;
		for(int j=1;j<=k-1;j++)  //这里表示 每一位例如第2位 要试探n个数,前面出现的就不要。 
		{
			if(a[k]==a[j])
			{
				flag=1;
				break; 
			}
			
		}
		if(flag==0)             //flag==1 表示前面已经用了那个数,就不能用了。 
		{
			if(k==m)			// 当k已经到了第m位,那就要输出这个全排列了 
			{
				for(int i=1;i<=m;i++)
				{
					printf("%d",a[i]);
				}
				printf("\n");
				s++; 			//s统计排列个数 
			}
			else
			P(k+1);				//k还没到达m位,那就继续寻找下一位。 
		}
	}
}


 

发布了44 篇原创文章 · 获赞 72 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cj151525/article/details/89736690