代码随想录 Day42 - 动态规划(三)
背包问题总览
如下图,备战面试,重点是 01 背包,完全背包,多重背包了解即可。
01 背包问题(二维数组)
步骤一:确认 dp 数组及下标的含义
dp[i][j]表示从下标为[0,i]的物品中,选取任意的物品并放入容量为 j 的背包的价值总和。
步骤二:确认递推公式
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
步骤三:初始化 dp 数组
步骤四:确定遍历顺序
两层 for 循环,先遍历物品或者背包重量都可以,正向遍历
步骤五:举例推导
01 背包问题(一维数组)
步骤一:确认 dp 数组及下标的含义
dp[j]表示容量为 j 的背包所背物品的最大价值。
步骤二:确认递推公式
dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
步骤三:初始化 dp 数组
步骤四:确定遍历顺序
先遍历物品再遍历背包,不可以颠倒顺序
步骤五:举例推导
416. 分割等和子集
此题需要特殊处理一下异常情况,如某个数超过总和一半。
二维数组解法:
复制代码
一维数组解法:
复制代码
版权声明: 本文为 InfoQ 作者【jjn0703】的原创文章。
原文链接:【http://xie.infoq.cn/article/c5ebbbf277476bc8fc790848e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论