⚠️ 剪枝会不会改变答案

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

开始练习 →

什么时候可以剪

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

开始练习 →

不剪枝要走多少个结点

把 1 到 5 排成一排,要求挨着的两个不能是连号。这个版本先把 5 个位置全排满,最后才检查。运行它,看走过了多少个结点: def naive(n): st = {"c": 0, "v":

开始练习 →

剪枝之后呢

同一个问题,这个版本放的时候就检查是不是连号,是就不往下走。运行它: def pruned(n): st = {"c": 0, "v": 0} path = [] used =

开始练习 →

先写不剪枝的版本

补全 naive:把 1 到 n 全排满,排满之后再检查有没有连号挨着。st["v"] 记走过的结点数。 把解的个数和结点数拼起来输出(n = 5)。

开始练习 →

再写剪枝的版本

补全 pruned:放上去之前就检查——和 path 最后一个相差 1 就跳过,不往下走。 把解的个数和结点数拼起来输出(n = 5)。

开始练习 →

⚠️ 省了多少,且解必须一样

把两个版本都写出来,输出三样:不剪枝的结点数、剪枝的结点数、以及两者解的个数是否相同(相同输出 结果一致,否则 结果不一致)。 三样用 / 拼起来。

开始练习 →

子集问题的规模

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

开始练习 →

有重复元素时怎么去重

元素里有重复时,避免生成重复子集的办法是【0】。

开始练习 →

组合类问题每层的起点

生成组合时,下一层递归的起点应该是【0】。

开始练习 →