精确k个整数的子集和?

时间:2012-03-23 12:14:05

标签: algorithm subset-sum

从这些问题Subset sum problemSum-subset with a fixed subset size开始,我想知道解决子集和问题的一般算法是什么,我们被迫使用完全k个整数,k< = n。

Evgeny Kluev提到他将使用k = 4的最优值,之后使用蛮力逼近k-4,其余为最佳。任何人都可以通过蛮力方法结合最佳k = 4算法来理解他的意思吗?

也许有人知道一个更好的,通用的解决方案?

1 个答案:

答案 0 :(得分:6)

原始的动态编程算法适用于略微扩展 - 除了记住部分和之外,还需要记住用于获得总和的int数。

在原始算法中,假设目标总和为M并且有n个整数,则填充布尔n x M数组A,其中A[i,m]为真,如果总和m可以通过从第一个i+1整数中选取(任意数量)来实现(假设从0开始索引)。

您可以将其扩展为三维数组n x M x k,它具有相似的属性 - A[i,m,l]为真iff,sum {{1}可以通过从第一个m整数中精确选择l来实现。

假设整数在数组i+1中:

递归关系非常相似 - 字段j[0..n-1]为真(您选择A[0,j[0],1],得到总和j[0]为1 int(duh)),{{1}中的其他字段} {是假的,j[0] A[0,*,*]中的字段与原始算法类似:如果A[i+1,*,*]为真,则A[i,*,*]为真(如果可以选择A[i+1,m,l] }从第一个A[i,m,l]整数开始,显然你可以从第一个m整数中选择i或者如果m为真(如果你选择i+1则会增加A[i, m - j[i+1], l-1]的总和和1的整数。

如果j[i+1]很小,那么显然跳过上述所有部分并迭代j[i+1]整数的所有组合并检查其总和是有意义的。 k确实似乎是一个合理的门槛。