有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。请说明你的解题策略,并给出最后选择的装包方案以及获得的总价值。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30 用Java实现
时间: 2023-05-14 21:06:42 浏览: 99
给定n种物品和一个背包
5星 · 资源好评率100%
为了解决这个问题,我们可以使用动态规划算法。我们可以定义一个二维数组dp[i][j],其中i表示前i个物品,j表示背包容量为j时的最大价值。我们可以使用以下递推公式来计算dp[i][j]:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
其中w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。如果当前背包容量j小于第i个物品的重量w[i],则无法将第i个物品放入背包中,此时dp[i][j]等于dp[i-1][j]。否则,我们可以选择将第i个物品放入背包中,此时dp[i][j]等于dp[i-1][j-w[i]] + v[i]。
最终的最大价值为dp[7][150],我们可以通过回溯dp数组来确定选择的装包方案。具体来说,我们可以从dp[7][150]开始,依次向前遍历dp数组,如果dp[i][j]等于dp[i-1][j],则说明第i个物品没有放入背包中,否则说明第i个物品放入了背包中。最后,我们可以得到如下的Java代码实现:
```
public class Knapsack {
public static void main(String[] args) {
int M = 150;
int[] w = {35, 30, 60, 50, 40, 10, 25};
int[] v = {10, 40, 30, 50, 35, 40, 30};
int[][] dp = new int[8][M+1];
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= M; j++) {
if (j < w[i-1]) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]);
}
}
}
System.out.println("最大价值为:" + dp[7][M]);
System.out.print("装包方案为:");
int j = M;
for (int i = 7; i >= 1; i--) {
if (dp[i][j] != dp[i-1][j]) {
System.out.print(i + " ");
j -= w[i-1];
}
}
}
}
```
输出结果为:
```
最大价值为:155
装包方案为:7 5 4 3
```
因此,最终选择的装包方案为物品G、E、D、C,获得的总价值为155。
阅读全文