⚠️ 四个版本的解数摆在一起
把四个版本都写出来,只输出各自解的个数: 完全正确的版本 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】。