繁体   English   中英

子集总和动态规划

[英]Subset Sum Dynamic Programming

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),而我相信的空间是相同的。 有什么办法可以改善这一点?

** 1)**将printsub函数更改为将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为正,则无需更改任何elsej替换为target+2-j

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

** 3)**这里链接到相同的问题- 降低了0-1背包问题的时间复杂度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM