子集和动态编程

时间:2017-03-15 22:36:26

标签: python dynamic-programming subset-sum

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(数组)*目标),我相信的空间是相同的。有没有办法改善这个?

1 个答案:

答案 0 :(得分:0)

** 1)**将printsub的{​​{1}}函数更改为i到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它是肯定的,无需更改任何内容else替换j中的target+2-j < / p>

 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