寻找比 O(2^N) 更快找到最便宜组合的算法

问题描述

问题定义如下:我需要找到最便宜的物品组合,这些物品组合在一起时至少可以制造一件物品。因此,如果我需要构建一个包含 A、B、C 和 D 部分的项目,我需要找到一个项目组合(我必须购买),我可以从中提取它们的部分来制作新项目。

Visualization of the problem

基本上在上图中,形状代表一个物品,数字代表该物品的成本。如果我组合三角形、星形和六边形,我可以使用它们的 A、B、C 和 D 部分来制作新项目。这也是最便宜的组合(来自检查)。您可以将剩余零件和物品的价格与它们拥有的零件数量和零件类型相比,没有相关性。您可以假设每个项目都没有您不需要的部分(例如,没有项目将有部分 'E' - 它们只能有集合 {A,B,C,D} 中的一部分)

我对这个问题的解决方是使用幂集算法将每个项目组合存储在一个数组中。然后我迭代每个组合以检查它是否是一个有效的解决方案。我使用了一个 hashmap 并用 替换了 hashmap 中的一个键,值对,与我正在迭代的项目相关联,如果我的 hashmap 在遍历整个组合后不包含 false,这意味着它是一个有效的解决方案。

然后我将每个有效的解决方添加到另一个集合中,并遍历集合的每个索引并跟踪成本,这样,我就能够找到最便宜的成本。

唯一的问题是这个算法的空间和时间复杂度都是O(2^N)。我想知道我是否可以做得更好,并且正在寻找关于我应该使用哪些数据结构的一些建议。我正在考虑使用最小堆并在每个部分中创建一个称为权重的新值,该值基本上是他们的成本除以他们拥有的部分数量(值越低越好)并使用它,我将实现一个优先级队列和我只是 poll() 来获得最有价值的项目。我遇到的问题是在我可能遇到冲突的情况下:例如我目前的解决方案可能是: Square 然后我尝试添加星号,但我发现我的解决方案已经有一部分(正方形和星形都共享一个 A)我应该删除正方形并添加星号还是删除星号并查看最小堆中的其他地方?随着我添加的案例数量变得非常复杂,我放弃了优先队列的想法,也许它不是正确的 DS 或者我没有正确使用它,所以我正在寻找一些建议,如果有可能的话更适合 DS。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)