作者:江魂2010_717 | 来源:互联网 | 2024-12-27 19:17
在计算机科学领域,0-1背包问题是一个经典的组合优化问题,旨在从一组具有不同重量和价值的物品中选择一些装入一个固定容量的背包,使得所选物品的总价值最大。下面我们将通过一个具体的例子来说明如何使用动态规划算法解决这个问题。
### 问题描述
假设有一个背包,其最大承重为10公斤,并且有三件物品可供选择,每件物品都有各自的重量和价值:
- 物品1:重量3公斤,价值4
- 物品2:重量4公斤,价值5
- 物品3:重量5公斤,价值6
### 动态规划解决方案
为了找到最优解,我们采用二维数组`dp[i][j]`表示前i个物品放入容量为j的背包时的最大价值。初始情况下,所有元素均设为0。接下来,根据以下规则逐步填充表格:
1. 如果当前物品的重量大于背包剩余容量,则保持原值不变;
2. 否则,比较不放入该物品与放入该物品后的两种情况,取较大者作为新的最大价值。
最终结果存储于`dp[num_items][capacity]`中,即为所求的最大价值。
```java
public class BackpackProblem {
private static final int CAPACITY = 10; // 背包容量
private static final int NUM_ITEMS = 3; // 物品数量
public static void main(String[] args) {
int[] weights = {3, 4, 5};
int[] values = {4, 5, 6};
int[][] dp = new int[NUM_ITEMS + 1][CAPACITY + 1];
for (int i = 1; i <= NUM_ITEMS; i++) {
for (int j = 1; j <= CAPACITY; j++) {
if (j 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[NUM_ITEMS][CAPACITY]);
}
}
```
此段代码展示了完整的Java程序,用于计算并输出给定条件下背包能装载的最大价值。