Loading docs/dp/knapsack.md +4 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,10 @@ $$ f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_{i}}+v_{i}) $$ 在程序实现的时候,由于对当前状态有影响的只有 $f_{i-1}$ ,故可以去掉第一维,直接用 $f_{i}$ 来表示处理到当前物品时背包容量为 $i$ 的最大价值,得出以下方程: 这里如果直接采用二维数组对状态进行记录,会出现 MLE。可以考虑改用滚动数组的形式来优化。 当然,不难发现对当前状态有影响的只有 $f_{i-1}$ ,故其实可以去掉第一维,直接用 $f_{i}$ 来表示处理到当前物品时背包容量为 $i$ 的最大价值,得出以下方程: $$ f_i=\max \left(f_i,f_{i-w_i}+v_i\right) Loading Loading @@ -70,10 +73,6 @@ for (int i = 1; i <= n; i++) } ``` ### 为什么不用记忆化搜索 是不是看着这个题目和前面的记忆化搜索很相似,前面是总采药时间,这里是总背包大小,前面是每种药的采集时间,这里是每个物品的体积,所以采用二维数组进行记录,然后会 MLE, **因为这里可以滚动数组** (见上面的例题代码) ## 完全背包 完全背包模型与 0-1 背包类似,与 0-1 背包的区别仅在于一个物品可以选取无限次,而非仅能选取一次。 Loading Loading
docs/dp/knapsack.md +4 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,10 @@ $$ f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_{i}}+v_{i}) $$ 在程序实现的时候,由于对当前状态有影响的只有 $f_{i-1}$ ,故可以去掉第一维,直接用 $f_{i}$ 来表示处理到当前物品时背包容量为 $i$ 的最大价值,得出以下方程: 这里如果直接采用二维数组对状态进行记录,会出现 MLE。可以考虑改用滚动数组的形式来优化。 当然,不难发现对当前状态有影响的只有 $f_{i-1}$ ,故其实可以去掉第一维,直接用 $f_{i}$ 来表示处理到当前物品时背包容量为 $i$ 的最大价值,得出以下方程: $$ f_i=\max \left(f_i,f_{i-w_i}+v_i\right) Loading Loading @@ -70,10 +73,6 @@ for (int i = 1; i <= n; i++) } ``` ### 为什么不用记忆化搜索 是不是看着这个题目和前面的记忆化搜索很相似,前面是总采药时间,这里是总背包大小,前面是每种药的采集时间,这里是每个物品的体积,所以采用二维数组进行记录,然后会 MLE, **因为这里可以滚动数组** (见上面的例题代码) ## 完全背包 完全背包模型与 0-1 背包类似,与 0-1 背包的区别仅在于一个物品可以选取无限次,而非仅能选取一次。 Loading