Java 在整数数组中求和为给定数的最小集

Java 在整数数组中求和为给定数的最小集,java,recursion,Java,Recursion,给定s和一个正整数数组,求元素加起来等于s的最小子集。例如,给定数组{1,2,3,4,5}和s=8,最小子集为{3,5} 到目前为止,我可以通过使用递归的贪婪方法来求解数组中的一组整数,但是我找不到如何找到最小子集。有没有我应该研究的特定算法 这就是“零一等式背包问题”。它是NP完全问题。然而,针对这一问题存在各种有效的算法 如果总和足够小,可以分配那么多的内存位并对其进行n次迭代(数组元素数),那么可以使用 像CPLEX、Gurobi和SCIP这样的解决方案通常在实践中可能出现的“典型”实例上

给定s和一个正整数数组,求元素加起来等于s的最小子集。例如,给定数组{1,2,3,4,5}和s=8,最小子集为{3,5}

到目前为止,我可以通过使用递归的贪婪方法来求解数组中的一组整数,但是我找不到如何找到最小子集。有没有我应该研究的特定算法

这就是“零一等式背包问题”。它是NP完全问题。然而,针对这一问题存在各种有效的算法

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

  • 像CPLEX、Gurobi和SCIP这样的解决方案通常在实践中可能出现的“典型”实例上表现相当好。当制定背包问题作为MIP解算器的输入时,需要小心一些,以避免精度问题

  • 如果你能容忍一些不精确性:对于不等式背包(你希望最小的一组数字加起来最多是s)存在并且不太难描述:将所有涉及的数字向下扩展到你可以做动态规划并处理结果的地方。如果您也注意接受近似问题的近似解,则可以使用相同的方法获得等式背包的近似解

  • 这就是“零一等式背包问题”,它是NP完全问题。然而,针对这一问题存在各种有效的算法

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

  • 像CPLEX、Gurobi和SCIP这样的解决方案通常在实践中可能出现的“典型”实例上表现相当好。当制定背包问题作为MIP解算器的输入时,需要小心一些,以避免精度问题

  • 如果你能容忍一些不精确性:对于不等式背包(你希望最小的一组数字加起来最多是s)存在并且不太难描述:将所有涉及的数字向下扩展到你可以做动态规划并处理结果的地方。如果您也注意接受近似问题的近似解,则可以使用相同的方法获得等式背包的近似解


  • 检查所有这些对于大型实例都非常有用。我想知道OP是不是在讨论小实例。所有这些对于大实例都很好。我想知道OP是不是在讨论一些小的例子。