子集总和包括负数与动态方法

问题描述

  • 问题是负数打破了子集和的经典动态方法解决方案。我编写了一个可以处理非负数组内容的算法,但我需要一个算法来处理给定数组中的负数。
def printPossibleSubsets(arr,i,inSum,pList,table):
        
    if i == 0 and inSum != 0 and table[0][inSum]:
        pList.append(arr[i])
        print(pList)
        pList = []
        return
    
    if i == 0 and inSum == 0:
        print(pList)
        pList = []
        return
    
    if table[i-1][inSum]:
        bList = []
        bList.extend(pList)
        printPossibleSubsets(arr,i-1,bList,table)

    if inSum >= arr[i] and table[i-1][inSum-arr[i]]:
        pList.append(arr[i])
        printPossibleSubsets(arr,inSum-arr[i],table)     

def subsetSum(arr,n,inSum):
    if n == 0 or inSum < 0:
        return

    table = [[False for x in range(inSum+1)] for y in range(n)] 
    for i in range(0,n):
        table[i][0] = True
    
    if arr[0] <= inSum:
        table[0][arr[0]] = True
    
    for i in range(1,n):
        for j in range(0,inSum+1):
            if arr[i] <= j:
                table[i][j] = table[i-1][j] or table[i-1][j-arr[i]]
            else:
                table[i][j] = table[i-1][j]

    if table[n-1][inSum] == False:
        print(f"There is no subset with {inSum}")
        return

    pList = []
    printPossibleSubsets(arr,n-1,table)

if __name__ == "__main__":
     
    arr = [2,3,-5,-8,6,-1]
    inSum = 0
    subsetSum(arr,len(arr),inSum)
  • 我之前尝试过使用数组元素的(最小和最大)总和值更改 j 边界,但没有奏效。
  • 有没有办法处理负数 sum 并根据所需的总和正确给出 sum 的子集?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)