【问题标题】:Subset Sum Dynamic Programming子集和动态规划
【发布时间】:2017-03-15 22:36:25
【问题描述】:
def subset(array, target):
    sol = [[False for x in range(target + 1)] for x in range(len(array) + 1)]
    for i in range(len(array)+1):
        sol[i][0] = True
    for i in range(1,(len(array)+1)):
        for j in range(1, target+1):
            if (j - array[i-1] >= 0):
                sol[i][j] = sol[i-1][j] | sol[i-1][j - array[i-1]]
            else:
                sol[i][j] = sol[i-1][j]
    printSub(sol, array, target)
    return sol[len(array)][target]

def printSub(sol, array, target):
    if(sol[len(array)][target]):
        print("Found!")
        i = len(array)
        j = target
        while(j!=0):
            if(sol[i-1][j] == True):
                i-=1
            else:
                print(array[i-1], end = " ")
                j = j - array[i-1]
    else:
        print("No combination found! ")

我有一个子集问题的工作代码,如果它找到一个等于所需目标的子集,它可以打印数字。

  1. 我想打印给定目标的所有可能子集,但我不知道要为此更改什么。

  2. 如何使它适用于负数?

  3. 时间复杂度是 O(len(array) * target) 和我相信的空间是一样的。有什么办法可以改善吗?

【问题讨论】:

    标签: python dynamic-programming subset-sum


    【解决方案1】:

    **1)**更改 printsub 函数,即循环 ithrough 1 到 len(array) 并使用if(sol[i][target]) 而不是 (sol[len(array)][target])

    **2)**双循环后-

    for i in range(1,(len(array)+1)):
        for j in range(1, target+1):
    

    添加一个条件来检查 array[i-1] 是否为负 if 是否为正 无需更改任何内容 elsej 替换为 target+2-jin

     if (j - array[i-1] >= 0):
                sol[i][j] = sol[i-1][j] | sol[i-1][j - array[i-1]]
    

    **3)**这里是相同问题的链接- Reducing time complexity of 0-1 Knapsack problem

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2015-03-24
      • 2018-06-11
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多