- 问题是负数打破了子集和的经典动态方法解决方案。我编写了一个可以处理非负数组内容的算法,但我需要一个算法来处理给定数组中的负数。
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, inSum, bList, table)
if inSum >= arr[i] and table[i-1][inSum-arr[i]]:
pList.append(arr[i])
printPossibleSubsets(arr, i-1, inSum-arr[i], pList, 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, inSum, pList, table)
if __name__ == "__main__":
arr = [2, 3, -5, -8, 6, -1]
inSum = 0
subsetSum(arr, len(arr), inSum)
- 我之前尝试的是
j用数组元素的(最小值和最大值)总和值改变边界,但它不起作用。
- 有没有什么方法可以处理负数 sum 根据所需的 sum 正确给出 sum 的子集?