拿下技术面上传简历

有 N 件物品,第 i 件体积 w[i]、价值 v[i],每件物品只能用一次,背包容量为 W。用一维数组 f[0..W] 写 0/1 背包时,内层容量循环必须写成 for (j = W; j >= w[i]; --j)。请说明为什么必须倒序,并自己举一个具体的数值例子(给出 w、v、W),把正序循环时数组被更新的过程一步步算出来,说明会出什么错。

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

面试官在考什么

判断他是真的理解一维 DP 中"滚动掉的维度到底滚掉了什么",还是只背下了 0/1 背包的循环写法;同时看他能不能自己构造小例子验证代码。

背包问题

回答框架 · 前两步

  1. 一维 f[j] 等价于把二维的 f[i][j] 滚掉第一维,更新 f[j] 时 f[j] 和 f[j-w[i]] 都必须是"只考虑前 i-1 件物品"的值。
  2. 倒序遍历时 j 从大到小,f[j-w[i]] 的更新发生在 j 之前、本轮还没碰到,所以它仍是第 i-1 层的结果,保证第 i 件物品至多被选一次。

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

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

延伸阅读

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

同一能力域的其他题