计算具有给定总和的所有子集 - Java

时间:2015-10-16 08:06:59

标签: algorithm dynamic-programming subset subset-sum coin-change

我有一个不同正整数的数组list,表示集合L和整数S。什么是计算所有L子集的最快方法,它们的元素总和等于S,而不是迭代所有子集,只检查每个子集的总和等于等于S

1 个答案:

答案 0 :(得分:0)

这可以使用简单的动态编程方法在O(NS)中解决,类似于背包问题。让每个Q和每个i解决以下问题:i的第一个L元素的子集有多少,以便它们的总和等于Q。让我们表示这些子集C[i,Q]的数量。

C[0,0]=1显然是C[0,Q]=0Q!=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]。迭代iQ,我们计算所有C s。

请注意,如果L中的所有元素都是非负数,那么您只能针对非负Q来解决问题,如果Q<L[i-1],第一个字词就会消失。如果允许使用负面元素,那么您也需要考虑否定Q