组合+排列算法汇总

C(m,n) 组合问题

dfs解决:注意:

  • 第一次从main函数传来的参数是(0,1)
  • 组合的第二个参数是start,dfs是循环开始的标记,这与排列不同
  • 如果是已知m n的情况直接改函数中的m n的值
int way[30];//全局数组,记录每种方案
int n,m;//全局变量n,m,进行操作后求出的是C(m,n)

void zuhe_C(int cnt,int start)  //首次在main函数从传来的参数是(0,1)
{
	if(cnt==m)	//当进入这个里面的时候已经排好了一种情况,可以在里面进行ans++或check等操作
	{
		for(int i=0;i<m;i++) cout<<way[i]<<' ';
		puts("");
		return;
	}
	for(int i=start;i<=n;i++)
	{
		way[cnt]=i;		
		zuhe_C(cnt+1,i+1);		//dfs
		way[cnt]=0;		//恢复现场
	}
}

A(m,n) 排列问题

dfs解决:注意:

  • 第一次从main函数传来的参数是(0)
  • 排列没有第二个参数,的标记,这与组合不同
  • 如果是已知m n的情况直接改函数中的m n的值
int way[30];//全局数组,记录每种方案
int n,m;//全局变量n,m,进行操作后求出的是A(m,n)
bool st[15];//状态数组

void pailie_A(int cnt)
{
	if(cnt==m)
	{
		for(int i=0;i<m;i++) cout<<way[i]<<' ';
		puts("");
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(!st[i])
		{
			st[i]=true;
			way[cnt]=i;
			pailie_A(cnt+1);		
			st[i]=false;//恢复现场
		}
	}
}

全排列A(n,n)的特殊解决方法:STL库函数

包含在< algorithm >头文件中的next_permutation()函数配合do while结构可以很方便地解决全排列问题。详见我的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值