给定sum和一个正整数数组,找到其元素加起来为s的最小子集。例如,给定数组{1,2,3,4,5}和sum s = 8,最小子集将是{3,5}。
到目前为止,我可以使用递归来解决一个整数集合,这些整数使用贪婪方法添加到数组中,但是我找不到如何找到最小子集。我应该研究一个特定的算法吗?
答案 0 :(得分:3)
这是“零一平等背包问题”。它是NP完全的。但是,存在各种有效的问题算法。
如果总和小到足以分配那么多内存并迭代n(数组元素数)次,则可以使用dynamic programming.
Mixed-integer program求解器通常会在实际可能出现的“典型”实例上做得相当好。在制定背包问题时需要注意作为MIP求解器的输入以避免精确度问题。
如果你可以忍受一些不精确:{{3>} 不等式背包(你希望最小的数字总和最多的那些数字)存在并且也不存在难以描述:将所涉及的所有数字缩放到可以进行动态编程并处理结果的位置。如果你注意接受近似问题的近似解决方案,你可以使用相同的方法来获得平等背包的近似解决方案。