Knapsack Problem Java2025年5月7日 | 阅读7分钟 最显著的组合优化问题之一是背包问题 Java。背包问题有两种类别。
让我们来讨论一下它们。 0 - 1 背包问题给定 n 个不同物品的价值和重量。需要将这些物品放入容量为 C 的背包中,使得背包的价值最大。同时,背包中所有物品的总重量不得超过容量 C。由于这是 0-1 背包问题;因此,不允许分割物品,即永远不能打碎任何给定的物品,要么不选它,要么选它(0-1 属性)。 ![]() 背包问题可以通过穷举搜索或动态规划来解决。 使用穷举搜索穷举搜索意味着应用暴力方法。在此方法中,尝试所有物品的组合,并为每种组合计算价值。生成最大价值的组合就是答案。 以下程序使用递归实现暴力方法。 文件名: KnapsackExample.java 输出 The maximum value is: 220 解释:输入数组的映射方式是,对于物品 i,重量为 weight[i],其价值为 values[i]。在每次递归调用中,都会做出一个决定,该物品是否应包含在解决方案中。如果不包含该物品,我们将继续进行,而不考虑其价值。如果包含该物品,则背包的容量会减少该物品的重量,我们继续进行,并包含其价值。其他物品也以类似的方式处理。通过添加所包含物品的价值产生的最大价值就是我们的答案。 请注意,该方法不是很方便,因为它需要很长时间才能给出结果。该方法的时空复杂度为 O(2 ^ n),其中 n 是存在的元素数。 使用动态规划之所以需要动态规划,是因为上述方法花费了大量时间来生成结果。因此,从长远来看,上述方法会失败。因此,我们需要寻找另一种方法,即动态规划。 文件名: KnapsackExample1.java 输出 The maximum value is: 220 解释:与第一种方法类似,这次我们也在包含和排除列表中的每个物品。然而,这次我们有 O(n^2) 的更好时空复杂度。这是因为,与上述方法不同,我们利用较小物品列表的解决方案来构建完整物品列表的解决方案(动态规划的属性)。因此,迭代次数较少。请注意,在两种方法中,我们完全排除了或包含了物品,从而遵循了 0-1 属性。 分数背包问题分数背包问题与 0-1 背包问题类似。唯一的区别是可以部分选择一个物品。因此,给予了打破任何物品然后将其放入背包的自由,以便最大化背包中所有物品(无论是否打破)的总价值。 文件名: KnapsackExample1.java 输出 Maximum value that can be obtained is = 240.0 解释:贪心算法用于解决分数背包问题。在此方法中,我们首先考虑那些在消耗较少重量的同时能产生最大价值的物品。换句话说,那些价值/重量比最大的物品。因此,我们通过价值/重量比来对列表进行非递减排序。因此,价值/重量比最高的物品位于第一个索引,价值/重量比第二高的物品占据第二个索引,依此类推。 |
在 Java 中,final 和不可变性是与对象状态和修改相关的关键概念。这两个概念处理不同的方面,即对象及其状态是如何管理的。在本节中,我们将讨论 Java 中 final 和不可变性之间的区别。Java final 关键字 final 关键字在...
阅读 4 分钟
在 Java 编程中,确定两个矩阵是否是彼此的镜像图像涉及按相反的顺序比较对应元素。当一个矩阵的行或列是另一个矩阵对应行或列的倒置版本时,该矩阵被认为是另一个矩阵的镜像图像……
阅读 6 分钟
Java 9 引入了许多新功能和增强功能,以进一步提升语言的功能。这些新增功能包括 orTimeout() 和 completeOnTimeout() 方法,它们旨在增强 CompletableFuture 实例中超时处理。这些方法为开发人员提供了更多控制和灵活性,当处理...
阅读 4 分钟
Java 程序可以使用简单的文本编辑器编写。但是,使用 Java 集成开发环境 (IDE) 可以帮助开发人员更有效地开发软件。IDE 提供了许多功能,如自动完成、调试器选项等。在本节中,我们将讨论一些广泛使用的 Java...
阅读 3 分钟
| Java ArrayList 大小 ArrayList 是 java.util 包的一部分,用于存储对象的动态列表。当添加或删除元素时,ArrayList 的大小可以动态地增加或减少。在 Java 中,要获取长度(元素数量)...
阅读 4 分钟
List 和 ArrayList 之间的区别 Java 集合提供了处理对象组的架构。集合表示对象的单个单元。它允许我们将对象组作为一个单元进行存储和操作。我们可以轻松地执行许多操作,例如...
5 分钟阅读
是在 Java 控制台中显示的错误消息,当 Java 程序中出现错误时显示。它类似于 Windows 错误消息,但特定于 Java 程序。此错误消息可以提供有关问题的关键信息,例如错误...
阅读 4 分钟
java.io.ObjectInputStream 类用于反序列化先前使用 ObjectOutputStream 序列化的对象和基本数据。它允许重建对象图,并确保序列化对象的类与当前 JVM(Java 虚拟机)类定义兼容。ObjectOutputStream 和 ObjectInputStream 协同工作以保存和...
阅读 22 分钟
| Java 程序对 0、1 和 2 进行排序数组 荷兰国旗(DNF)问题是最著名的编程问题之一,由著名的荷兰计算机科学家 Edsger Dijkstra 提出。顾名思义,它基于荷兰国旗...
7 分钟阅读
Java中的选择语句是控制流语句,允许您根据特定条件在代码中做出决策。这些语句使您的Java程序能够根据特定条件是真还是假来执行不同的代码块。选择语句是基本...
阅读 15 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India