暑期算法学习经验分享
暑期算法学习经验分享
动态规划
0 - 1 背包问题
理论基础
- 理论基础详见:0 - 1背包问题理论基础
- ⚠️注意区分以下两类问题:
背包价值最大化(max)类→ 求可达性/最值
- 分割等和子集:416.分割等和子集
- 思路:
- 这道题目可以看成是
0 - 1背包问题的变式,题目只要求将一个数组分割成两个子集,使得两个子集的元素和相等。那么可以将背包容量设定为数组总和sum的一半,即sum/2,各个物品的重量和价值都是nums数组的元素,若能刚好装下sum/2容量的背包则返回true,否则返回false。 - 按照动态规划五部曲进行分析:
- 确定
dp数组及下标的含义:dp[j]的定义为:背包在容量为j的情况下从0到i的物品中选择装入得到的最大重量。 - 确定递推公式(与
0 - 1背包问题一致):- 状态转移方程
dp[j] = max(dp[j], dp[j-nums[i]]+nums[i]);;
- 状态转移方程
dp数组如何初始化:全部初始化成0;- 确定遍历顺序:在
i上正序遍历,在j上倒序遍历; - 举例推导
dp数组符合要求。
- 确定
- 这道题目可以看成是
- 代码:
1 | |
装满背包有多少种方案类 → 求方案数
- 整数划分(01背包基础题):整数划分(01背包基础题)
- 思路:
- 这题本质是在问:从
1~n里选若干个互不相同的数,使它们的和等于n,一共有多少种选法。由于每个数只能用一次,所以它就是一个 0/1 背包计数问题。 - 按照动态规划五部曲进行分析:
- 确定
dp数组及下标的含义:从数字1 ~ i中选取若干个互不相同的正整数,使它们的和恰好为j的方案数。 - 确定递推公式(与
0 - 1背包问题一致):- 状态转移方程
dp[j] = (dp[j] + dp[j - i]) % MOD;;
- 状态转移方程
dp数组如何初始化:dp[0] = 1表示凑出和为0有 1 种方法,即“什么都不选”;其余位置初始化为0,表示一开始还没有方案能凑出对应的和。- 确定遍历顺序:在
i上正序遍历,在j上倒序遍历; - 举例推导
dp数组符合要求。
- 确定
- 这题本质是在问:从
- 代码:
1 | |
暑期算法学习经验分享
http://example.com/2026/03/22/tazi_algorithm/