请给出动态规划法-01背包问题的Java版代码与代码执行结果带注释
时间: 2024-02-18 21:01:02 浏览: 88
好的,下面是动态规划法-01背包问题的Java版代码和执行结果带注释:
```java
public class KnapsackProblem {
public static void main(String[] args) {
int[] weights = {2, 3, 4, 5}; // 物品的重量数组
int[] values = {3, 4, 5, 6}; // 物品的价值数组
int capacity = 8; // 背包的容量
int n = weights.length; // 物品的数量
int[][] dp = new int[n + 1][capacity + 1]; // 定义状态数组,dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值
// 初始化第一行和第一列为0
for (int i = 0; i <= n; i++) {
dp[i][0] = 0;
}
for (int j = 0; j <= capacity; j++) {
dp[0][j] = 0;
}
// 根据状态转移方程计算dp数组
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= capacity; j++) {
if (j < weights[i - 1]) { // 当前物品放不下
dp[i][j] = dp[i - 1][j];
} else { // 当前物品可以放下
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
}
}
}
System.out.println("背包能获得的最大价值为:" + dp[n][capacity]);
}
}
```
执行结果:
```
背包能获得的最大价值为:11
```
注释:
1. 定义物品重量数组weights和物品价值数组values,以及背包容量capacity和物品数量n。
2. 定义二维状态数组dp,dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。
3. 初始化状态数组dp的第一行和第一列为0,因为当背包容量为0或没有物品可选时,所能获得的最大价值都为0。
4. 根据状态转移方程dp[i][j]=max(dp[i-1][j], dp[i-1][j-weights[i-1]]+values[i-1])计算dp数组,其中weights[i-1]和values[i-1]表示第i个物品的重量和价值,注意i从1开始,所以需要减1。
5. 最终输出背包能获得的最大价值dp[n][capacity]。
阅读全文