完全背包问题
题目描述
给定物品重量和价值,求在背包容量限制下的最大价值。
核心思路
-
确定 dp 数组及其下标含义 定义一维 dp 数组,下标表示背包大小。
-
确定递推公式 因为完全背包的物品是无限个,所以放完了一个,还能在同一层找。 二维递推公式写法:dp[i][j] = max(dp[i - 1][j], dp[i][j - w[i]] + v[i]) 一维递推公式写法:dp[j] = max(dp[j], dp[j - w[i]] + v[i])
四个经典的动态规划问题:完全背包、零钱兑换 II、组合总和 IV 以及爬楼梯。重点分析了 dp 数组的定义、递推公式的推导、初始化的设置以及遍历顺序的区别。完全背包使用正序遍历求最大值;零钱兑换 II 和爬楼梯关注组合数,需先遍历物品;组合总和 IV 关注排列数,需先遍历背包。注意处理大数溢出问题,选择合适的数据类型。
给定物品重量和价值,求在背包容量限制下的最大价值。
确定 dp 数组及其下标含义 定义一维 dp 数组,下标表示背包大小。
确定递推公式 因为完全背包的物品是无限个,所以放完了一个,还能在同一层找。 二维递推公式写法:dp[i][j] = max(dp[i - 1][j], dp[i][j - w[i]] + v[i]) 一维递推公式写法:dp[j] = max(dp[j], dp[j - w[i]] + v[i])
初始化数组 全部为 0。
确定循环顺序 因为完全背包物品有无限个,所以遍历背包可以正序遍历,这样正好默认是在同一层。
一维递推公式写法:dp[j] = max(dp[j], dp[j - w[i]] + v[i])
计算凑成总金额的组合数。
定义一维 dp 数组 dp[j] 为填满背包大小为 j 的背包的组合数有 dp[j] 种。
确定递推公式 因为求的是方法有多少种,所以用累加的形式: dp[j] = dp[j] + dp[j - w[i]]; 表示填满当前背包有两种来源: 不放物品 i,那么就是 dp[j]。 放物品 i,那么就是 dp[j - w[i]]。
初始化 dp 数组 dp[0] = 1;
确定遍历方向 先遍历物品,再遍历背包。背包是正序遍历。
计算凑成目标值的排列数。
定义一个一维 dp 数组 dp[j] 表示当背包为 j 时,排列数为多少个。
确定递推公式 dp[j] = dp[j] + dp[j - w[i]];
初始化 dp 数组 dp[0] = 1;
确定遍历顺序 因为求的是排列数,对顺序有要求,那我们就考虑填满每个背包大小的最后一个值是什么。因为每个背包大小都要考虑,所以物品在内层循环。
每次可以爬 1 到 m 个台阶,求爬到第 n 阶的方法数。
确定一维 dp 数组及其下标含义 dp[j] 表示爬上台阶为 j 总共有 dp[j] 种方法。
推导递推公式 dp[j] = dp[j] + dp[j - w[i]];
初始化数组 dp[0] = 1;
确定遍历顺序 因为是排列数,所以物品放内,背包放外。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online