用于乘法的背包算法

时间:2012-05-10 17:43:54

标签: algorithm knapsack-problem

我有一组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: -

  1. 这不是一个家庭作业问题,在接受采访时被问到。我只被问到算法,我只能说它看起来有点像背包问题,但是用于乘法。
  2. 请原谅我是否无法正确解释问题。

2 个答案:

答案 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)

如上所述,这不是背包问题。只需按顺序对对进行排序,从开始选择直到达到产品限制,然后根据成本重新排序。如上所述,并不要求总成本应低于任何阈值或限制,因此最佳解决方案是选择具有最小第一元素的对。