把二维改成一维
二维版的转移是 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 外面,再运行。 (