我有一组N
个数字,每个号码都附有一些费用,问题是选择所有可能的数字组作为列表,使其产品小于某个数字{{1} },根据成本总和排序。
例如: - 这组数字是
M
且产品必须小于(number, costOfThatNumber) : {(90, 10) , (80, 20), (60, 40), (40, 60), (15, 85)},
,
可能的解决方案是: -
Prod <= 1000
因此列表变为[Solution 1 :- {(15, 85), (40, 60)} :- Product = 600 (which is less than, 1000), cost = 85 + 60 = 145]
[Solution 2 :- {(15, 85), (80, 20)} :- Product = 900 and cost = 105]
。
PS: -
答案 0 :(得分:5)
我认为可以将问题减少到背包问题。
请注意
x1 * x2 * ... * xn <= M <->
log(x1*x2*...*xn) <= log(M) <->
log(x1) + log(x2) + ... + log(xn) <= log(M)
因此,可以使用背包找到最佳解决方案:
weight'(item) = log(weight(item))
value(item) = value(item)
M' = log(M)
run Knapsack on the items with weight', value, M'
需要做更多工作才能获得所有可行的解决方案,而不仅仅是最优解,但由于存在指数(2^n
if M = infinity
),我怀疑甚至存在伪多项式解决方案。
一种非有效的解决方案就是创建power set(包含所有可能集合的集合),并检查每个集合的可行性及其价值,并根据其值在有序集合中存储可行解决方案。 This post解释了如何获得权力。
答案 1 :(得分:0)
如上所述,这不是背包问题。只需按顺序对对进行排序,从开始选择直到达到产品限制,然后根据成本重新排序。如上所述,并不要求总成本应低于任何阈值或限制,因此最佳解决方案是选择具有最小第一元素的对。