排列和组合的枚举

permulation其实是一个dfs,不明白为什么在紫书里面被划分为暴力

//下面的代码实现了从n个数当中排列k个。
int permu(int cur) {
	//到了边界
	if (cur == k) {
		int sum=0;
		for (int i = 0; i < k; i++) {
			sum += a[i];
		}
		printf("%d\n", sum);
	}

	//枚举当前cur层次的所有路径。
	for (int i = 0; i < n; i++) {
		int notused = 1;
		for (int j = 0; j < cur; j++) {
			if (a[j] == p[i]) { notused = 0; }
		}
		if (notused) {
			a[cur] = p[i];
			permu(cur + 1);
		}
	}
}

permutation翻译为全排列,但是全排列更加应当是allArrangement。全部排列。
与之对应的是全组合。
下面就是全组合的一个实例。注意:这里枚举的不是具体的值,而是序号。
因为只有枚举序号才能够保证枚举到相同的元素的时候不重复。因为元素的内容相同(eg:都是1),他们的序号也是不同的。
(eg a[3]=1,a[4]=1.)

/*选数
下面的代码实现了 从n个数中选k个求和,判断和是不是质数
@para bru:Before aRe Used, bru之前的序号都已经枚举过了,不能够再枚举了。
*/
void dfs(int cur, int sum, int bru)
{
	if (cur == k)
	{
		if (isprime(sum)) tot++;
		return;
	}
	for (int i = bru; i < n; i++)
		dfs(cur + 1, sum + a[i], i + 1);
	return;
}

如果单纯对于序号进行枚举的话就允许重复元素作为不同的元素进行排列,所以排列一般直接对具体元素进行讨论。
因为
1 1 1 a1 a2 a3
1 1 1 a2 a1 a3
1 1 1 a3 a2 a1
1 1 1 a2 a3 a1

是一样的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值