⚠️ 四个版本的解数摆在一起

把四个版本都写出来,只输出各自解的个数: 完全正确的版本 res.append(path)(存引用) 漏了 path.pop() 漏了 used[i] = False 四个数用 / 拼起来。

开始练习 →

拿到一个搜索问题,先想清楚什么

要用回溯解一个新问题,第一件事是想清楚【0】。

开始练习 →

交付一个回溯解要验什么

把一个带剪枝的回溯解交出去,必须验的是【0】。

开始练习 →

四项一起对得上吗

运行下面这段程序: def perm(a): res = [] path = [] used = [False] * len(a) def dfs(): if len(path) == len

开始练习 →

第一步:排列、组合、子集

最终作品第一步:写出 perm、comb、subs,输出三个个数([1,2,3] 全排列 / [1,2,3,4] 取 2 / [1,2,3] 子集)。

开始练习 →

第二步:把路径记对

写出撤销写全、并且存**副本**的 perm,输出解的个数和第一个解。

开始练习 →

第三步:剪枝,并证明它没剪错

写出 naive 和 pruned(1 到 5 排一排、挨着的不能是连号),输出不剪枝结点数 / 剪枝结点数 / 解数是否一致。

开始练习 →

第四步:N 皇后

写出 ok 和 queens,把 n = 4、5、6、7 各跑一遍,四个解数拼起来输出。

开始练习 →

交付:回溯 + 剪枝验收

这是这条路线的最终作品。把前四步的代码合起来,一次验完五条: [1,2,3] 全排列 6 个,[1,2,3] 子集 8 个 第一个排列是 1,2,3(说明存的是副本,不是引用) 漏了 path.pop() 的版本只有 1 个解(说明撤销确实

开始练习 →

⚠️ 「重叠子问题」是什么意思

说一个问题有「重叠子问题」,是指【0】。

开始练习 →