给出完整java代码实现动态规划算法实现0-1背包问题输出选择的最大价值以及选择了哪些物品。
时间: 2024-05-06 18:21:21 浏览: 75
好的,以下是实现动态规划算法解决0-1背包问题的Java代码:
```
import java.util.Arrays;
public class Knapsack01 {
public static int knapsack(int[] wt, int[] val, int W, int n) {
int[][] dp = new int[n + 1][W + 1];
// 初始化第一行和第一列为0
for (int i = 0; i < n + 1; i++) {
dp[i][0] = 0;
}
for (int j = 0; j < W + 1; j++) {
dp[0][j] = 0;
}
// 根据动态规划的思路,逐步填充dp矩阵
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < W + 1; j++) {
if (wt[i - 1] <= j) {
dp[i][j] = Math.max(val[i - 1] + dp[i - 1][j - wt[i - 1]], dp[i - 1][j]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
// 依据dp矩阵回溯求解选中的物品集合
int i = n, j = W;
int totalVal = dp[n][W];
System.out.println("选择的物品集合为:");
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i - 1][j]) {
System.out.print(i + " ");
j = j - wt[i - 1];
}
i--;
}
System.out.println();
return totalVal;
}
public static void main(String[] args) {
int[] wt = { 10, 20, 30 };
int[] val = { 60, 100, 120 };
int W = 50;
int n = 3;
int maxVal = knapsack(wt, val, W, n);
System.out.println("选择的最大价值为:" + maxVal);
}
}
```
其中,wt数组代表物品的重量,val数组代表物品的价值,W代表背包的容量,n代表物品的数量。对于这个问题,程序通过动态规划求解得到最大价值,并根据dp矩阵回溯得到选择的物品集合。如果有需要,也可以将程序调整为接收外部输入来满足更加灵活的使用场景。
阅读全文