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
…
是一样的
1769

被折叠的 条评论
为什么被折叠?



