共计 1529 个字符,预计需要花费 4 分钟才能阅读完成。
纾寒
2023-07-07 11:29:20
浏览数 (1206)
在 Java 的面试中,算法问题是常见的考察内容之一。零一背包问题是经典的动态规划问题,涉及到优化资源利用的背包选择。本文将介绍一道经典的 Java 面试题——零一背包问题,并提供详细的解析和解题思路。
题目
给定一个背包的容量 capacity,以及一组物品,每个物品有其对应的重量和价值。要求选择一些物品放入背包中,使得总重量不超过背包容量,且总价值最大化。假设每个物品只有一个,即零一背包问题。
示例
假设背包容量为 10,物品集合如下:
物品 1:重量 2,价值 4
物品 2:重量 3,价值 5
物品 3:重量 4,价值 8
物品 4:重量 5,价值 9
求解最大的总价值以及选取的物品集合。
解析与解题思路
零一背包问题可以使用动态规划来解决。下面是使用动态规划解决该问题的具体步骤:
- 创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个物品中,背包容量为 j 时的最大总价值。
- 初始化 dp 数组的第一行和第一列为 0,表示背包容量为 0 或没有物品可选时,最大总价值为 0。
- 遍历物品集合,对于每个物品 i,依次计算 dp[i][j] 的值。根据动态规划的思想,我们有两种选择:如果物品 i 的重量大于背包容量 j,则无法选择该物品,最大总价值为 dp[i-1][j]。如果物品 i 的重量小于等于背包容量 j,则可以选择该物品。选择该物品时,最大总价值为物品 i 的价值加上前 i - 1 个物品在背包容量为 j 减去物品 i 重量时的最大总价值,即 dp[i-1][j-w[i]] + v[i](w[i] 为物品 i 的重量,v[i] 为物品 i 的价值)。
综上所述,dp[i][j] 的值为上述两种选择中的较大值。 - 最终结果为 dp[n][capacity],其中 n 为物品的个数。
下面是使用动态规划解决该问题的 Java 代码示例:
public class Knapsack {
public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length;
int[][] dp = new int[n + 1][capacity + 1];
for (int i = 1; i int weight = weights[i - 1];
int value = values[i - 1];
for (int j = 1; j if (weight> j) {dp[i][j] = dp[i - 1][j];
} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight] + value);
}
}
}
return dp[n][capacity];
}
public static void main(String[] args) {int[] weights = {2, 3, 4, 5};
int[] values = {4, 5, 8, 9};
int capacity = 10;
int maxTotalValue = knapsack(weights, values, capacity);
System.out.println("Maximum total value:" + maxTotalValue);
}
}
在上述代码中,我们通过动态规划的方式填充 dp 数组,最终得到的 dp[n][capacity] 即为背包容量为 capacity 时的最大总价值。
结论
通过使用动态规划,我们可以解决零一背包问题,选择最优的物品组合以获得最大总价值。这道经典的 Java 面试题考察了面试者对动态规划思想和算法的理解。理解动态规划的基本原理和思考问题的方式对于解决复杂的优化问题至关重要。在面试中,清晰地解释算法思路和实现过程,展现出自己的编程能力和问题解决能力,将为面试成功奠定基础。
学 java,就到 java 编程狮 !
原文地址: 经典 Java 面试题解析:零一背包问题