Python 带负数的0-1 knapSnack问题

Python 带负数的0-1 knapSnack问题,python,algorithm,data-structures,graph-algorithm,knapsack-problem,Python,Algorithm,Data Structures,Graph Algorithm,Knapsack Problem,给定一组正数和负数,找出我们是否可以选择其中的一些,并以最终和为零的方式求和。任何非零的数字都可以 我们有它们的权重和值 我相信这是0-1背包问题的一个版本。 示例输入和输出: 4 - weight - percent + 50 30 + 80 1 - 20 30 - 30 30 这是我为它编写的代码,但不知何故,我不明白为什么这不起作用: 我得到它的输出0,我应该得到1000,选择第一个,第三个和第四个。 有什么方法可以解决带负值的背包问题吗 def knapSack(W , wt , va

给定一组正数和负数,找出我们是否可以选择其中的一些,并以最终和为零的方式求和。任何非零的数字都可以

我们有它们的权重和值

我相信这是0-1背包问题的一个版本。 示例输入和输出:

4 - weight - percent
+ 50 30
+ 80 1
- 20 30
- 30 30
这是我为它编写的代码,但不知何故,我不明白为什么这不起作用: 我得到它的输出0,我应该得到1000,选择第一个,第三个和第四个。 有什么方法可以解决带负值的背包问题吗

def knapSack(W , wt , val , n): 
    if n == 0 : 
        return 0
    if (wt[n-1] > W): 
        return knapSack(W , wt , val , n-1) 
    else: 
        return max(val[n-1] + knapSack(W-wt[n-1] , wt , val , n-1), knapSack(W , wt , val , n-1)) 

val = [80, 50, -20, -30] 
wt = [ 1,30, 30, 30] 
W = 0
n = len(val) 
print(knapSack(W, wt, val, n)) 

任何人都知道我应该如何改变它才能工作吗?

这绝对不是有效的方法,但这似乎是最简单的方法,可以看出酸和碱的任何组合是否会抵消。我没有使用背包的方法

对于每个酸和碱,创建一个包含其数量的数组。在您的示例中,这些数组将是-acid=[1500,80]和base=[600900]。获取这些数组取决于您的输入格式

拥有这些阵列后,您可以执行以下操作-

def SumOfSubsets(arr): 
    Allsums = []
    for number in arr:
        Placeholder = Allsums[:]
        Allsums.append(number)
        for sum in Placeholder:
            Allsums.append(sum + number)

    return(Allsums)

AcidList = SumOfSubsets(acid)
BaseList = SumOfSubsets(base)

for acids in AcidList:
    if acids in BaseList:
        print("can be neutralized")


*注意,通过使用这种方法,您不知道需要什么酸和碱的组合来实现中和。如果需要,您可以使用另一个函数来获得此组合。

中和它们意味着什么?你能给出更多的定义吗?我将编辑这个问题。我的意思是,我们可以选择其中的一些,并以一种最终混合物不是酸性或碱性的方式进行混合@justhalf@MJane你是否限制了我们的混合数量?例如,在某些情况下,3种酸和2种碱可能最终中和,而其他组合则没有限制。只要说,如果你能混合一些非零的数字,就可以@karanshishoo只需要注意,有2^n-1个酸/碱的组合。你必须全部检查,我不需要知道是什么组合。但显然,这只适用于某些测试用例。25人中有8人。其他人在网上判断答案是错误的。但我会想办法解决的。谢谢。如果我没弄错的话,这是使用暴力算法。是吗?@MJane,是的,在看是否有匹配之前,这会检查所有可能的酸和碱的总和组合up@MJane,你能告诉我我的代码出了什么问题吗?我在AcidList中添加了以下代码:found=False,用于酸列表中的酸:if acids in BaseList:found=True printyes break iffind==False:printno,当我添加break时,它起作用了。你的代码没有问题。
def SumOfSubsets(arr): 
    Allsums = []
    for number in arr:
        Placeholder = Allsums[:]
        Allsums.append(number)
        for sum in Placeholder:
            Allsums.append(sum + number)

    return(Allsums)

AcidList = SumOfSubsets(acid)
BaseList = SumOfSubsets(base)

for acids in AcidList:
    if acids in BaseList:
        print("can be neutralized")