代码随想录 背包问题 | 分割等和子集
背包问题
解题思路
二维
还是动态规划的五部曲。
- 通过设置一个二维数组来建立一个背包容量和物体重量的关系。dp[i][j],i代表当前背包的容量,j代表一种物体
- 找到递归关系:由于我们要找到符合塞满背包的物体,因此我们的dp需要比较放物体前后的值,然后取大的那个。
- 初始化数组:在背包容量为0时,由于装不了任何物品,所以全取零。而当我们放置物体1时,为所有满足物体一容量的格子赋予物体1的价值
- 确定遍历顺序:按照物体的质量和背包的容量大小进行迭代,对于每一个物体,我们都需要遍历所有能放的下它的容量。
- 枚举,通过手写举例得到最后结果
【二刷】先遍历物品和先遍历背包重量都是可以的
- 先遍历物体再遍历重量,意味着每个物品能放在哪个容量里,
- 先遍历重量再遍历物体,意味着每个重量能放多少物体
一维
需要更改第一步和第4步,在一维中,我们只要考虑当前的格子是否要放入物体,第四步我们要注意从后往前遍历,因为从前往后会让我们重复放入物体。
知识点
背包,动态规划
心得
挺难的一道题,我直接选择看题解
分割等和子集
解题思路
把题目转换为是否存在一个集合,能够装满总和的1/2,随后套用01背包的解放就行
知识点
背包
心得
难点在于想到如何将题目转化为背包问题