【问题标题】:Find a subset from a set of integer whose sum is closest to a value从一组整数中找到一个子集,其总和最接近某个值
【发布时间】:2013-09-18 15:54:02
【问题描述】:

正如标题所说,从一组整数中找到一个子集,其和最接近一个值。 set里面大概有1000个item,价值1000万左右,我考虑过用DP(Dynamic Programming)来解决这个问题,就像“装箱问题”一样,但是这个方法不适合,set是太大,值太大。

我能做什么,尝试启发式算法?但是如何和使用哪个?

【问题讨论】:

标签: algorithm


【解决方案1】:

启发式算法:

从小到大的顺序

  1. 找到小于期望值的最大值(二分查找)

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

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

  4. 用尽后,从壁橱中拾取目标。

【讨论】:

  • 你能提供一些证据吗?
  • 不。这是一种启发式方法。
  • 动机?你为什么不试试呢。你有反例说明逻辑有缺陷吗?
  • 否决者请发表评论(如果不是@justhalf)
  • 叹息,这应该是你作为回答者的工作。好的,您能否进一步解释一下您在第二步中“保存此值组合”是什么意思?
【解决方案2】:

我不知道它的效率如何,但您可以尝试 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

您可以使用任何求解器包求解上述整数线性规划。

【讨论】:

  • 您可以通过解释什么是 MILP 和 LP 来改进这篇文章。
猜你喜欢
  • 2021-05-23
  • 2013-11-03
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多