01背包-2维
可以理解
1
2
3
4
5
6
7
8
9
10
11
12# 1.定义dp数组,明确dp[i][j]的含义:
# 从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大为 dp[i][j]。
# 2.确定转移公式,
# dp[i][j] 从dp[i-1][j]来
# 当物品i的重量大于j,放不进来,保持原状 dp[i-1][j]
# 否则,dp[i][j] = max(dp[i-1][j],dp[i - 1][j - weight[i]] + value[i])
# dp[i - 1][j - weight[i]] + value[i]) j - weight[i],预留出物品i的重量,放进i,并则增加i的value
# 3.dp数组的初始化
# dp[i][0]=0,dp[0][j] i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。 j < weight[0]的时候,dp[0][j] 应该是 0;当j >= weight[0]时,dp[0][j] 应该是value[0]
# 4.确定遍历顺序
# 从转移公式看,是从前向后遍历的,可以先遍历物品再遍历重量
# 5.举例推导dp数组
0x5 今日收获,记录一下自己的学习时长
- 1h
01背包问题 一维
- 遍历顺序不好理解
1 | # 1.定义dp数组,明确dp[j]的含义: |
0x5 今日收获,记录一下自己的学习时长
- 1h
416. 分割等和子集
题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/
0x1 看到题目的第一想法
0x2 自己实现过程中遇到哪些困难
- 一维遍历顺序
0x3 今日学习的文章链接,或者视频链接
0x4 看完代码随想录之后的想法
- dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]
- dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
- 如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历
1
2
3
4// 开始 01背包
for i in range(len(nums)):
for j in range(target, nums[i] - 1, -1):
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
0x5 今日收获,记录一下自己的学习时长
- 1h
总结
- 01背包的一维和二维实现
复习
- day13
- 二叉树的前中后序遍历
待重点复习
416