编写Java代码解决01背包
以下是使用动态规划算法解决01背包问题的Java代码:
public class KnapsackProblem {
public static void main(String[] args) {
int[] weight = {1, 3, 4, 5}; // 物品的重量
int[] value = {1500, 2000, 3000, 3500}; // 物品的价值
int capacity = 10; // 背包容量
int n = value.length; // 物品数量
int[][] dp = new int[n + 1][capacity + 1]; // dp数组,dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值
// 初始化dp数组,第一行和第一列都为0
for (int i = 0; i < n + 1; i++) {
dp[i][0] = 0;
}
for (int i = 0; i < capacity + 1; i++) {
dp[0][i] = 0;
}
// 使用动态规划算法解决01背包问题
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < capacity + 1; j++) {
if (weight[i - 1] > j) { // 当前物品的重量大于背包容量,不能放入背包
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], value[i - 1] + dp[i - 1][j - weight[i - 1]]);
}
}
}
// 输出dp数组
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < capacity + 1; j++) {
System.out.print(dp[i][j] + "\t");
}
System.out.println();
}
// 输出最大价值
System.out.println("背包能够获得的最大价值为:" + dp[n][capacity]);
}
}
在上述代码中,我们使用二维数组dp来记录每个子问题的最优解。在初始化dp数组时,第一行和第一列都为0,因为在没有物品或者背包容量为0时,无论怎样都不能获得任何价值。之后,我们使用两层循环遍历所有的子问题,如果当前物品的重量大于背包容量,那么无法将该物品放入背包中;否则,我们可以考虑将该物品放入背包中,此时背包所能获得的最大价值为dp[i-1][j-weight[i-1]]+value[i-1],其中dp[i-1][j-weight[i-1]]表示在放入该物品之前背包的最大价值,value[i-1]表示该物品的价值。我们将该值与不放该物品时背包能够获得的最大价值dp[i-1][j]相比较,取其中的较大值即为当前子问题的最优解。最终,dp[n][capacity]即为背包能够获得的最大价值。
原文地址: http://www.cveoy.top/t/topic/bfFV 著作权归作者所有。请勿转载和采集!