Algorithm 从一组总和最接近某个值的整数中查找子集

Algorithm 从一组总和最接近某个值的整数中查找子集,algorithm,Algorithm,正如标题所说,从一组和最接近某个值的整数中找出一个子集。 集合中大约有1000个项目,值约为1000万,我考虑过使用DP(动态规划)来解决这个问题,就像“装箱问题”,但这种方法不适用,集合太大,值太大 我能做什么,尝试启发式算法?但是如何使用哪一种?一种启发式算法: 从最小到最大的顺序集 查找小于所需值的最大值(二进制搜索) 从最小值开始,尝试第1步中找到的最大值。如果完全匹配,则完成。否则,总额将超过目标。保存此值组合 从1开始重复。从1中的下一个较小值开始,组成另一个和。重复此操作,直到超出

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

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

一种启发式算法:

从最小到最大的顺序集

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

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

  • 从1开始重复。从1中的下一个较小值开始,组成另一个和。重复此操作,直到超出值

  • 筋疲力尽时,选择目标


  • 我不知道它的效率有多高,但你可以试试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
    

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

    您在这里问这个问题,而不是在5秒内通过谷歌阅读关于这个主题的许多文章,这是有原因的吗?5秒内似乎没有答案,因为这个问题没有名字。然而,请阅读!你可以通过解释什么是MILP和LP来改进这篇文章。你能提供一些证据吗?不。这是一种启发,动机?你为什么不试试呢。你是否有一个反例表明逻辑是有缺陷的?请反对者留下评论(如果不是@justhalf)感叹,这应该是你作为回答者的工作。好的,请您进一步解释一下,您在第二步中所说的“保存此值组合”是什么意思?