计算总和等于k的子集数

Abh*_*pta 9 algorithm count subset-sum

给定一个数组,我们需要找出具有恰好等于给定整数k的和的子集数量.请为此问题建议最佳算法.这里只需要计数就不需要实际的子集.

该数组由整数组成,可以是负数也可以是非负数.

示例:数组 - > {1,4,-1,10,5} abs sum-> 9 {4,5}和{-1,10}的答案应为2

ami*_*mit 10

这是子集和问题的变体,它是NP-Hard - 因此没有已知的多项式解.(事实上​​,子集求和问题表明,如果甚至有一个子集与给定总和相加,则很难找到).

解决它的可能方法是强力(检查所有可能的子集),或者如果集合包含相对较小的整数,则可以使用伪多项式动态编程技术:

f(i,0) = 1    (i >= 0) //succesful base clause
f(0,j) = 0    (j != 0) //non succesful base clause
f(i,j) = f(i-1,j) + f(i-1,j-arr[i])  //step
Run Code Online (Sandbox Code Playgroud)

将动态编程应用于上述递归公式可为您提供O(k*n)时间和空间解决方案.

使用f(n,k)[假设基于1的数组索引] 调用.

  • 但是这个算法不计算有多少个子集.此算法仅告诉您是否存在解决方案.即便在此之后并应用回溯,您也可以获得一个解决方案.不是所有的解决方案. (4认同)