从一组整数中找出一个子集,其整数最接近一个值

时间:2013-09-18 03:22:16

标签: algorithm

正如标题所说,从一组整数中找出一个子集,其总和最接近一个值。 其中约有1000个项目,价值约为1000万,我考虑过用DP(动态编程)来解决这个问题,就像“装箱问题”一样,但这个方法不合适,套装是太大,价值太大。

我该怎么办,尝试启发式算法?但是如何使用哪个?

2 个答案:

答案 0 :(得分:0)

启发式算法:

订单设置最小到最大

  1. 查找小于所需值的最大值(二进制搜索)

  2. 从最小值开始,尝试在步骤1中找到的值。如果完全匹配,则完成。否则直到总和超过目标。保存这些值组合。

  3. 重复1.从1中的下一个较小值开始,以组成另一个总和。重复直到超出值

  4. 用尽时,选择总和衣柜到目标。

答案 1 :(得分:0)

我不知道它的效率如何,但您可以尝试MILP(混合整数线性规划)方法。

LP配方:

Variables: Xi = 1 if element No. i is selected.
           Z1: Negative deviation from VALUE
           Z2: Positive deviation from VALUE

Minimize Objective function:
   Z1 + Z2      // Given the nature of problem, at most 1 among Z1 and Z2 shall be > 0.

Subject to constraint:
   summation(WiXi) + Z1 - Z2 = VALUE
   Xi = 0 or 1.
   Z1, Z2 >= 0

您可以使用任何解算器包解决上述整数线性编程。