子集和算法,在集合中重复数字

时间:2012-08-13 07:34:13

标签: algorithm language-agnostic

我有一个包含自然数的集合S和一个作为数字的目标t。我想知道如何找到这些数字的可能组合的数量,这些数字总计达到目标t。
数字可以被取任何次数,并且可以获取任意数量的数字总和等于目标t。

Example
target  6
Set s  {3,8,1,2}
Solution   3+3, 3+2+1, 1+1+1+3, 2+2+2, 2+1+1+2, 2+1+1+1+1, 1+1+1+1+1+1
Total No of solutions possible  7

有效的算法是什么?

1 个答案:

答案 0 :(得分:2)

如果目标相当小,可以使用动态编程来获得O(| S | * t)解。以下是Python中的示例代码:

def combinations(S, t):
    dp = [1] + [0] * t
    for i in S:
        for j in range(0, t - i + 1):
            dp[j + i] += dp[j]
    return dp[t]