我有一个不同正整数的数组list
,表示集合L
和整数S
。什么是计算所有L
子集的最快方法,它们的元素总和等于S
,而不是迭代所有子集,只检查每个子集的总和等于等于S
?
答案 0 :(得分:0)
这可以使用简单的动态编程方法在O(NS)
中解决,类似于背包问题。让每个Q
和每个i
解决以下问题:i
的第一个L
元素的子集有多少,以便它们的总和等于Q
。让我们表示这些子集C[i,Q]
的数量。
C[0,0]=1
显然是C[0,Q]=0
和Q!=0
。 (注意i=0
表示前0个元素,即没有元素。)
对于较大的i
,我们有两种可能性:最后一个可用元素(L[i-1]
)被带到我们的集合,然后我们有C[i-1, Q-L[i-1]]
个这样的集合。要么没有采取,那么我们有C[i-1, Q]
个这样的集合。因此,C[i,Q]=C[i-1, Q-L[i-1]]+C[i-1, Q]
。迭代i
和Q
,我们计算所有C
s。
请注意,如果L
中的所有元素都是非负数,那么您只能针对非负Q
来解决问题,如果Q<L[i-1]
,第一个字词就会消失。如果允许使用负面元素,那么您也需要考虑否定Q
。