从这些问题Subset sum problem和Sum-subset with a fixed subset size开始,我想知道解决子集和问题的一般算法是什么,我们被迫使用完全k个整数,k< = n。
Evgeny Kluev提到他将使用k = 4的最优值,之后使用蛮力逼近k-4,其余为最佳。任何人都可以通过蛮力方法结合最佳k = 4算法来理解他的意思吗?
也许有人知道一个更好的,通用的解决方案?
答案 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
确实似乎是一个合理的门槛。