背包中子集中的最大元素数

时间:2013-10-09 12:31:47

标签: algorithm knapsack-problem

我有一个整数数组,我需要找到这个数组的子集,其中最多3个元素等于W。

我能用背包解决这个问题吗?或者我需要计算每个1-2-3元素组合的数组?

非常感谢

1 个答案:

答案 0 :(得分:1)

要查找总和为W的3个元素,这正是the 3SUM problem

可以通过以下任一方式在O(n 2 )时间内解决:

  • 将每个数字插入哈希表,然后,对于两个数字ab的每个组合,检查哈希表中是否存在W-a-b

  • 然后,为每个元素a排序数组,使用来自任意一方的2个迭代器,查找两个总和为W-a的元素。

如果整数范围在[-u, u]范围内,则可以使用O(n + u log u)中的快速傅里叶变换解决问题。有关此方法或上述方法之一的详细信息,请参阅上述链接。

由于您的问题依赖于解决3SUM问题,这是一个众所周知的问题,因此您不太可能找到比上述3SUM众所周知的解决方案更好的运行时间的解决方案。

要查找1个元素:

您可以进行简单的线性搜索(O(n))。

寻找2个元素:

这可以通过简单地检查O(n 2 )中的2个元素的每个组合来解决(你不需要做一些更复杂的事情,因为3个元素的渐近运行时间将导致O( n 2 )总时间,无论其效率如何)。

也可以使用与上述3SUM相同的方法在O(n)或O(n log n)中求解。

总体运行时间:

O(n 2 )或O(n + u log u),取决于使用哪种方法来解决3SUM部分。