交付:状态 + 转移 + 记忆化

这是这条路线的最终作品。把前四步的代码合起来,一次验完五条: 朴素 fib(12) 调用 465 次,记忆化只要 23 次,两者结果相同 填表 fib(12) 也是 144,三种写法一致 爬 10 级 89 种,打家劫舍 12,最大子段和

开始练习 →

⚠️ 「0/1 背包」里的 0/1 指什么

「0/1 背包」这个名字里的 0 和 1,指的是【0】。

开始练习 →

二维 dp[i][c] 表示什么

一件只拿一次,还是能拿多次 只一次 拿多次 0/1 背包的二维写法里,dp[i][c] 表示【0】。

开始练习 →

⚠️ 一维写法为什么必须倒着填

一件只拿一次,还是能拿多次 只一次 拿多次 0/1 背包压成一维之后容量必须从大到小循环,因为【0】。

开始练习 →

一维表最后长什么样

一件只拿一次,还是能拿多次 只一次 拿多次 三件物品 (重3值8)、(重4值9)、(重5值11),容量 10,每件最多拿一次。运行下面这段程序,看整张一维表: def knap1d(items, cap): dp = [0] * (

开始练习 →

⚠️ 那个 40 是怎么填出来的

一件只拿一次,还是能拿多次 只一次 拿多次 回到「贪心」那条路线(`l1_algo_07_n06`)里的三件东西:(重6值30)、(重5值20)、(重5值20),容量 10。当时只说了最优解是 40,现在把它填出来: def knap1d(

开始练习 →

写二维 0/1 背包

一件只拿一次,还是能拿多次 只一次 拿多次 补全 knap2d:dp[i][c] 是前 i 件、容量 c 时的最大价值。输出 dp[3][10]。

开始练习 →

写一维 0/1 背包

一件只拿一次,还是能拿多次 只一次 拿多次 补全 knap1d:只用一个一维数组,容量从大到小循环。输出容量 10 时的最大价值。

开始练习 →

⚠️ 正着填和倒着填,差在哪

一件只拿一次,还是能拿多次 只一次 拿多次 把一维背包写两遍,只改容量循环的方向:一个从大到小,一个从小到大。同一批物品、同一个容量 10。 把两个答案拼起来输出(倒着填的在前)。

开始练习 →

完全背包和 0/1 差在哪

完全背包和 0/1 背包的唯一区别是【0】。

开始练习 →