拿下技术面上传简历

用记忆化搜索写 0/1 背包:状态 dfs(i, j) 表示只考虑前 i 件物品、剩余容量 j 时能拿到的最大价值,转移为 dfs(i,j) = max(dfs(i-1,j), dfs(i-1, j-w[i]) + v[i])(v[i] >= 0)。你把 memo[i][j] 全部初始化为 0,并用 if (memo[i][j] != 0) return memo[i][j]; 来判断"这个状态算过没有"。请说明这个写法哪里有问题、什么时候会出错,并给出正确的改法。

数据结构与算法动态规划与贪心校招知识点 1 个

面试官在考什么

判断候选人有没有真的自己写过记忆化搜索,知不知道"用某个值表示未计算"这个约定成立的前提是什么,以及剪枝失效会带来什么后果。

记忆化搜索

回答框架 · 前两步

  1. 会出错:当某个状态的合法答案恰好是 0(比如剩余容量放不下任何物品、或者所有能选的物品价值都是 0)时,memo 里的 0 既表示"算过了,答案是 0",又表示"没算过",用 != 0 判断会把它当成没算过。
  2. 后果是这些状态会被反复递归计算,记忆化剪枝失效,最坏情况下递归树重新膨胀,复杂度从 O(n*W) 严重退化(可能接近指数级)而超时。

还有 3 条答案要点、 3 层追问、 5 个常见坑, 以及针对你简历的追问路径,在定制报告里。

上传简历,生成我的题库先看示例报告

延伸阅读

想看这个方向的整体准备路线? 进入「数据结构与算法」方向页

同一能力域的其他题