背包问题是一类经典的动态规划问题,它非常灵活,需要仔细琢磨体会,本文对背包问题中基本的0/1背包问题和对应的leetcode题目作一个总结,期望可以用一套框架解决背包问题。
- 01 背包问题:
最基本的背包问题就是 01 背包问题:背包承重为 Capacity, 现在有n个物品,物品重量 w[n], 物品价值 v[n]。如何选择物品价值最大?
特点:每种物品仅有一件,可以选择放或不放, 即0/1.
1.1 背包问题具备的特征:
是否可以根据一个 target(直接给出或间接求出),target 可以是数字也可以是字符串,再给定一个数组 arrs,问:能否使用 arrs 中的元素做各种排列组合得到 target。
1.2 背包问题解法:
如果是 01 背包,即数组中的元素不可重复使用,外循环遍历 arrs,内循环遍历 target,且内循环倒序:
下面给出0/1背包基本问题的DP方法代码:
// 0/1 背包问题
// 背包承重为 Capacity, 现在有n个物品,物品重量 w[n], 物品价值 v[n]。如何选择物品价值最大?
// 特点:每种物品仅有一件,可以选择放或不放, 即0/1.
// 背包承重量10,5件物品,重量[2,3,3,4,6], 价值[1,2,5,9,4].
public static int maxValue(int C, int[] W, int[] V) {
int[][] dp = new int[W.length][C + 1]; // dp[i][j]表示0 ~ i 件物品中任意取,背包容积为j的最大价值为dp[i][j]
// 先处理表格中第一行
// 从背包容量为0开始到背包满了,检查第0号物品能否放入背包
for (int j = 0; j <= C; j++) {
dp[0][j] = (j >= W[0]) ? V[0] : 0;
}
for (int i = 1; i < W.length; i++) // 外循环遍历arrs
for (int j = 0; j <= C; j++) { // 内循环遍历target

本文介绍了0/1背包问题的基本概念,强调了其作为动态规划问题的特点,并通过LeetCode上的具体题目,如'分区使序列和相等'、'零一矩阵'和'目标和',展示了如何将这些问题转化为0/1背包问题来解决。文章提供了状态转移方程和相关代码示例,帮助读者理解解题框架。

1243

被折叠的 条评论
为什么被折叠?



