【问题标题】:Finding the Minimal Set That Sum to a Given Number in an Array of Integers在整数数组中找到给定数字和的最小集合
【发布时间】:2012-12-29 04:23:17
【问题描述】:

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

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

【问题讨论】:

标签: java recursion


【解决方案1】:

这是“零一等式背包问题”。它是NP完全的。但是,存在多种有效的算法来解决这个问题。

  1. 如果总和足够小,可以分配那么多位的内存并对其进行 n(数组元素的数量)次迭代,则可以使用 dynamic programming.

  2. Mixed-integer program CPLEX、Gurobi 和 SCIP 等求解器通常在实践中可能出现的“典型”实例上表现良好。在将背包问题公式化为 MIP 求解器的输入时,需要注意避免精度问题。

  3. 如果你能容忍一些不精确:Polynomial-time approximation schemes for inequality 背包(你希望最小的数字集合最多为 s)存在并且并不难描述:将所有涉及的数字缩小到可以进行动态编程并处理结果的程度。如果您也注意接受近似问题的近似解,则可以使用相同的方法来获得等式背包的近似解。

【讨论】:

  • 所有这些都非常适合大型实例。不过,我想知道 OP 是否在谈论小型实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2022-06-12
  • 2017-03-05
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多