From d67bf626a9b5b57541d8ab5448da6ee50416fed7 Mon Sep 17 00:00:00 2001 From: tiechui1994 <2904951429@qq.com> Date: Mon, 24 Jun 2024 00:20:29 +0800 Subject: [PATCH] update dp --- algorithm/dp/dp.md | 47 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/algorithm/dp/dp.md b/algorithm/dp/dp.md index 34f5c7b..f336d76 100644 --- a/algorithm/dp/dp.md +++ b/algorithm/dp/dp.md @@ -77,7 +77,7 @@ f[i][j] = ( ``` Minimum Path Sum -设状态为 f[i][j], 表示从起点 (0; 0) 到达 (i; j ) 的最小路径和, 则状态转移方程为: +设状态为 f[i][j], 表示从起点 (0, 0) 到达 (i, j) 的最小路径和, 则状态转移方程为: f[i][j]=min(f[i-1][j], f[i][j-1])+grid[i][j] ``` @@ -158,3 +158,48 @@ dict = ["leet", "code"]. dp[i] 表示源串的前i个字符可以满足分割, 那么 dp[ j ] 满足分割的条件是存在k 使得 dp [k] && substr[k,j]在字典里. ``` +11.背包问题 + +- 01背包问题: 每种物品只有一个, 可以选择放或不放。 + +``` +01背包问题: + +dp[i][w] 表示选择 nums[0:i] 个元素, 重量不超过 w 的最大价值: + +dp[i][w] = max(dp[i-1][w - nums[i]]+nums[i], dp[i-1][w]) + +for i in [1..N]: + for w in [1..W]: + dp[i][w] = max( + 把物品 i 装进背包, + 不把物品 i 装进背包 + ) +return dp[N][W] +``` + +- 完全背包问题: 每种物品有无限个, 可以选择放任意个. + +``` +完全背包问题: + +dp[i][w] 表示选择 nums[0:i] 个元素, 重量不超过 w 的最大价值: + +dp[i][w] = max(dp[i-1][w - k*nums[i]] + k*nums[i]) 0 <= k <= +OO + +||、 + +dp[i][w] = max(dp[i-1][w - nums[i]] + nums[i]) + +for i in [1..N]: + for w in [1..W]: + dp[i][w] = max( + 把物品 i 装进背包, + 不把物品 i 装进背包 + ) +return dp[N][W] +``` + + +- 多重背包问题: 每种物品有有限个, 可以选择放任意个但不能超过给定的数量. +