动态规划(背包问题)
题目
416. 分割等和子集
1049. 最后一块石头的重量 II
494. 目标和
474.一和零
对题目的想法
- 01背包已经看懂了,理论上这几道题应该是01背包的变种,然后一开始根本看不出来这些。
- 01背包所用的例子里面重量数组恰好是排序的,误以为每次应用背包问题都要先排序,后来才意识到并不需要。
实现中/后的感想、看完代码随想录之后的想法
- 分割等和子集:
- 机械性得想套用01背包的模型,发现找不到weight和value。看了题解才知道这种情况下weight = value。
- 所以这道题确实是非常标准的01背包题目。
- 最后一块石头的重量 II:
- 一开始想用类似贪心的算法,
dp[i] = min(abs(dp[i - 1] + stones[i]), abs(dp[i - 1] - stones[i]))
但是行不通。 - 直接看题解,然后发现此时依然是weight = value。
- 一开始想用类似贪心的算法,
- 目标和:
- 头疼点在于要求的是物品数量的总和,而不是最大的weight或者最大的value。此时试图用额外的计数器,每当dp[bagweight] == target时就让计数器加一,不过思路很混乱。
- 题解实际上看得有点晕,虽然记住了但是应该没有彻底理解,不如另外几道题印象深刻。
- 一和零:
- 下意识先把每个String都变成一个长度为二的数组,虽然后来看题解之后发现没有必要。
- 这一题的关键在于背包的重量有两个维度,所以需要改写for循环中遍历重量的一条:
for ( 每个元素/物品 ) { for ( 从最大重量 到当前物品的重量 ){ dp数组的更新; } }