在整数数组中查找与给定数字求和的最小集合

时间:2013-01-15 05:05:39

标签: java recursion

给定sum和一个正整数数组,找到其元素加起来为s的最小子集。例如,给定数组{1,2,3,4,5}和sum s = 8,最小子集将是{3,5}。

到目前为止,我可以使用递归来解决一个整数集合,这些整数使用贪婪方法添加到数组中,但是我找不到如何找到最小子集。我应该研究一个特定的算法吗?

1 个答案:

答案 0 :(得分:3)

这是“零一平等背包问题”。它是NP完全的。但是,存在各种有效的问题算法。

  1. 如果总和小到足以分配那么多内存并迭代n(数组元素数)次,则可以使用dynamic programming.

  2. 像CPLEX,Gurobi和SCIP这样的
  3. Mixed-integer program求解器通常会在实际可能出现的“典型”实例上做得相当好。在制定背包问题时需要注意作为MIP求解器的输入以避免精确度问题。

  4. 如果你可以忍受一些不精确:{{3>} 不等式背包(你希望最小的数字总和最多的那些数字)存在并且也不存在难以描述:将所涉及的所有数字缩放到可以进行动态编程并处理结果的位置。如果你注意接受近似问题的近似解决方案,你可以使用相同的方法来获得平等背包的近似解决方案。