【发布时间】:2012-12-29 04:23:17
【问题描述】:
给定总和 s 和一个正整数数组,找到其元素加起来为 s 的最小子集。例如,给定数组 {1,2,3,4,5} 和总和 s = 8,最小子集将是 {3,5}。
到目前为止,我可以通过使用递归的贪婪方法解决 a 一组整数,这些整数加起来是数组,但我找不到如何找到最小子集。我应该研究一个特定的算法吗?
【问题讨论】:
给定总和 s 和一个正整数数组,找到其元素加起来为 s 的最小子集。例如,给定数组 {1,2,3,4,5} 和总和 s = 8,最小子集将是 {3,5}。
到目前为止,我可以通过使用递归的贪婪方法解决 a 一组整数,这些整数加起来是数组,但我找不到如何找到最小子集。我应该研究一个特定的算法吗?
【问题讨论】:
这是“零一等式背包问题”。它是NP完全的。但是,存在多种有效的算法来解决这个问题。
如果总和足够小,可以分配那么多位的内存并对其进行 n(数组元素的数量)次迭代,则可以使用 dynamic programming.
Mixed-integer program CPLEX、Gurobi 和 SCIP 等求解器通常在实践中可能出现的“典型”实例上表现良好。在将背包问题公式化为 MIP 求解器的输入时,需要注意避免精度问题。
如果你能容忍一些不精确:Polynomial-time approximation schemes for inequality 背包(你希望最小的数字集合最多为 s)存在并且并不难描述:将所有涉及的数字缩小到可以进行动态编程并处理结果的程度。如果您也注意接受近似问题的近似解,则可以使用相同的方法来获得等式背包的近似解。
【讨论】: