前言:
完全背包问题是背包问题的一个变种,与0/1背包问题不同,在完全背包问题中,每种物品可以被选取多次。问题描述如下:
给定 n 件物品,每件物品有一个重量 wi和一个价值 vi,以及一个背包,它能够承载的最大重量为 W。我们需要确定应该将哪些物品放入背包,以使得背包内物品的总价值最大。
背包问题分类:
- 0-1背包问题 Java数据结构与算法(0/1背包问题)-CSDN博客
- 完全背包问题
- 多重背包问题
- 混合背包问题
- 二维背包问题
- 分组背包问题
- 有依赖的背包问题 (困难)
解题思路:
动态规划是解决完全背包问题的常用方法。我们可以通过修改0/1背包问题的动态规划方法来实现。
核心思想: 构建一个一维数组 dp[j]
,其中 j
表示当前背包容量。dp[j]
表示容量为 j
的背包中可以获得的最大价值。
状态转移方程:
- 如果选择第 i件物品:
dp[j] = max(dp[j], dp[j - wi] + vi)
实现代码
java
public class CompleteKnapsack {
public static int completeKnapsack(int W, int[] weights, int[] values, int n) {
int[] dp = new int[W + 1];
for (int i = 0; i < n; i++) {
for (int j = weights[i]; j <= W; j++) {
dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
}
}
return dp[W];
}
public static void main(String[] args) {
int W = 50; // 背包容量
int[] weights = {10, 20, 30}; // 物品重量
int[] values = {60, 100, 120}; // 物品价值
int n = values.length;
System.out.println("最大价值: " + completeKnapsack(W, weights, values, n));
}
}
QA1:0/1背包和完全背包dp设计的差异作用?
dp[i]的作用就是用于区分一个物品能否重复放置,具体获取的值可以输出打印细细体会。