把二维改成一维

二维版的转移是 dp[i][c] = max(dp[i-1][c], dp[i-1][c-w] + v)。把它改写成只用一个一维数组的 knap1d,输出容量 10 的最大价值。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重

开始练习 →

答案和用掉的格子一起报

写出一维版,输出「容量 10 的最大价值/这个一维表的长度」。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, int>>,auto [w, v]

开始练习 →

答案与空间一起摆出来

把二维版和一维版都写出来,输出四样:二维答案/一维答案/二维格子数/一维格子数。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, int>>,aut

开始练习 →

这张表占多少内存

第 1 步:一格约等于 10 MB 第 2 步:上:5000×5000 个 int 第 3 步:下:栈只有约 8 MB 第 4 步:放局部:栈装不下,崩溃 第 5 步:滚成一维:只剩 5000 个 int dp[5000][5000] 大约

开始练习 →

大数组放在函数里会怎样

把 int dp[5000][5000] 写在 main 里面(局部变量),运行时【0】。

开始练习 →

memset 按什么填

memset(dp, 1, sizeof dp) 之后,int 数组 dp 里的每个元素是【0】。

开始练习 →

一亿字节是多少 MB

运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #include <vector> using nam

开始练习 →

只留两行也能算对

下面只开两行,用 i & 1 轮流当「这一行」和「上一行」。运行这段程序: 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, int>>,au

开始练习 →

用两行滚动写背包

补全 knap_roll:只开两行,第 i 件物品写进 dp[i & 1],从 dp[(i & 1) ^ 1] 取上一行。输出容量 10 的最大价值。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11

开始练习 →

把大表挪到函数外面

求 3000 × 3000 网格的路径数(对 10^9+7 取模)。起始代码把 grid 开在 main 里面——约 36 MB 的局部数组,一运行就会因为栈放不下而段错误崩溃(故意的:让你亲眼看看)。把它挪到 main 外面,再运行。 (

开始练习 →