经典Java面试题解析:零一背包问题

6,530次阅读
没有评论

共计 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

求解最大的总价值以及选取的物品集合。

解析与解题思路

 零一背包问题可以使用动态规划来解决。下面是使用动态规划解决该问题的具体步骤:

  1. 创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个物品中,背包容量为 j 时的最大总价值。
  2. 初始化 dp 数组的第一行和第一列为 0,表示背包容量为 0 或没有物品可选时,最大总价值为 0。
  3. 遍历物品集合,对于每个物品 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] 的值为上述两种选择中的较大值。
  4. 最终结果为 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 面试题解析:零一背包问题

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-20发表,共计1529字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)