【发布时间】:2016-09-30 12:27:27
【问题描述】:
我有 ID 为 1, 3, 4, 5, 6, 7 的项目。现在我有如下数据。
每行都有一个 offerId。 Array of Ids 由数组中的ID 组合而成。 Discount 是 offerId 的值
offerId : Array of Ids : Discount
o1 : [1] : 45
o2 : [1 3 4] : 100
o3 : [3 5] : 55
o4 : [5] : 40
o5 : [6] : 30
o6 : [6 7] : 20
现在我必须选择所有给我最佳 ID 组合的 offerId,即最大总折扣。
例如在上述情况下:可能的结果可能是:
[o2, o4, o5] 最大折扣为170(100 + 40 + 30)。
注意。结果 offerId 应该是 Id 不重复。 o2,o4,o6 的示例是 [1,3,4]、[5]、[6],它们都是不同的。
其他组合可以是:
o1, o3, 06 的 id 分别为 [1]、[3,5]、[6,7] 但是总数为 120(45+55+20) 小于 170,如前一种情况。
考虑到每个报价都应包含不同的 Ids,我需要一个算法/代码来帮助我识别 combination of offerIds,这将给出 maximum discount。
注意我正在用go 语言编写我的代码。但是任何语言的解决方案/逻辑都会有所帮助。
注意:我希望我能够正确解释我的要求。如果需要任何额外信息,请发表评论。谢谢。
【问题讨论】:
-
我不确定这是否是问这个问题的正确地方。请不要投反对票。
-
这看起来并不比 exact cover problem 更容易,但有权重,所以我认为多项式解决方案不太可能。
-
在这个问题中,如果只有几个 ID(比如说,最多 20 个),我会采用动态编程解决方案:f (
s: subset of IDs) = 最大可能折扣对于任何一组提供精确子集s。 -
我已经编辑了我的问题。有时最佳组合不会是一组中的
exact cover。 (注意:我已将 o5 的值更改为 30) -
因此,您必须检查所有可能的子集,而不仅仅是整个集合。算法复杂度保持不变。