Python 子集和动态规划

Python 子集和动态规划,python,dynamic-programming,subset-sum,Python,Dynamic Programming,Subset Sum,我有一个子集问题的工作代码,它可以打印数字,如果它发现一个子集等于期望的目标 我想打印给定目标的所有可能子集,我不知道要为此更改什么 如何使它适用于负数 时间复杂度是O(len(array)*target),我相信空间也是一样的。有什么办法可以改进吗 **1) **将printsub函数更改为i到len(数组),并使用if(sol[i][target])代替(sol[len(数组)][target]) **2) **在双环路之后- def subset(array, target): s

我有一个子集问题的工作代码,它可以打印数字,如果它发现一个子集等于期望的目标

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

  • 如何使它适用于负数

  • 时间复杂度是O(len(array)*target),我相信空间也是一样的。有什么办法可以改进吗
  • **1) **将
    printsub
    函数更改为
    i
    len(数组)
    ,并使用
    if(sol[i][target])
    代替
    (sol[len(数组)][target])

    **2) **在双环路之后-

    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! ")
    
    添加一个条件,检查数组[i-1]是否为负值
    如果为正值,则无需更改任何内容
    其他
    替换
    j
    目标+2-j

    for i in range(1,(len(array)+1)):
        for j in range(1, target+1):
    
    **3) **这里是相同问题的链接-

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