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! ")
我有一个子集问题的工作代码,如果找到与所需目标相等的子集,则可以打印数字。
我想打印给定目标的所有可能子集,我不明白该改变什么。
如何使其适用于负数?
答案 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