找出漏掉的恢复现场

下面的全局数组版返回时忘了把 used_g[x] 改回去,只数出 1 个排列。修好它,输出 1 到 4 的全排列个数。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

剪枝是什么

第 1 步:第一位放 1 或 2 第 2 步:第二位的四种接法 第 3 步:挨着的是连号:当场剪掉 第 4 步:只有这一枝继续往下走 空 1 2 1,2 1,3 2,1 2,3 回溯里的剪枝是指【0】。

开始练习 →

剪枝会不会改变答案

剪枝对最终结果的影响是【0】。

开始练习 →

什么时候可以剪(C++)

可以剪掉一条分支的条件是【0】。

开始练习 →

不剪枝要走多少个结点

把 1 到 5 排成一排,要求挨着的两个不能是连号。这个版本先把 5 个位置全排满,最后才检查。运行它,看走过了多少个结点: #include <cstdlib> #include <iostream> #inclu

开始练习 →

剪枝之后呢

同一个问题,这个版本放的时候就检查是不是连号,是就不往下走。运行它: #include <cstdlib> #include <iostream> #include <string> #include &

开始练习 →

先写不剪枝的版本

补全 naive_dfs:把 1 到 n 全排满,排满之后再检查有没有连号挨着。st.v 记走过的结点数。把解的个数和结点数拼起来输出(n = 5)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

再写剪枝的版本

补全 pruned_dfs:放上去之前就检查——和 path 最后一个相差 1 就跳过,不往下走。把解的个数和结点数拼起来输出(n = 5)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

省了多少且解必须一样

把两个版本都写出来,输出三样:不剪枝的结点数、剪枝的结点数、两者解的个数是否相同(相同输出 结果一致,否则 结果不一致)。三样用 / 拼起来。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

子集问题的规模(C++)

n 个不同元素的子集一共有【0】个。

开始练习 →