用Java编程:现有一个容量为50的背包和三个物品,它们的重量分别是10,20,30,价值分别为60,100,120,如何装入物品使背包装满,且装入背包的物品总价值最大。
时间: 2023-12-02 08:57:16 浏览: 235
以下是使用动态规划算法的Java代码实现:
```java
public class KnapsackProblem {
public static void main(String[] args) {
int[] weights = {10, 20, 30};
int[] values = {60, 100, 120};
int capacity = 50;
int n = weights.length;
int[][] dp = new int[n + 1][capacity + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= capacity; j++) {
if (weights[i - 1] > 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[n][capacity]);
int[] selected = new int[n];
int i = n, j = capacity;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i - 1][j]) {
selected[i - 1] = 1;
j -= weights[i - 1];
}
i--;
}
System.out.println("装入背包的物品为:");
for (i = 0; i < n; i++) {
if (selected[i] == 1) {
System.out.println("物品" + (i + 1) + " 重量:" + weights[i] + " 价值:" + values[i]);
}
}
}
}
```
输出结果为:
```
背包最大价值为:220
装入背包的物品为:
物品2 重量:20 价值:100
物品3 重量:30 价值:120
```
说明将第2个和第3个物品装入背包可以使得背包装满且价值最大。
阅读全文