【问题标题】:Subset sum algorithm with repetition of numbers in the set集合中数字重复的子集求和算法
【发布时间】:2012-08-09 10:11:32
【问题描述】:

我有一个包含自然数的集合 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

什么是有效的算法?

【问题讨论】:

  • 您已经认为它与subset sum problem 有关。它比归约的子集和问题更难(可归约):如果有 x>0 解决方案,则接受 - 否则,拒绝。所以这个问题也是NP-Hard,在有效(多项式)的标准定义中,没有已知的有效解决方案。对于您的案例,您有其他有效的定义吗?如果是这样 - 请指定它。
  • @amit 为什么动态编程在这里不起作用?
  • @amit 我只想知道有没有多项式时间解。
  • 这是一个相同问题的解决方案:algorithmist.com/index.php/Coin_Change
  • @irrelephant: 问题是 NP-Hard,DP 算法很可能会产生 pseudo polynomial 解,它不是多项式,不被认为是高效 在其标准定义中。如果可以找到 NP-Hard 问题的多项式解决方案,它将证明 P=NP(可能并非如此)。

标签: algorithm language-agnostic


【解决方案1】:

如果目标相当小,您可以使用动态规划来获得 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2023-03-12
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多