Python 给定一个整数列表,将其拆分为两个列表,如果相等,则返回True,否则返回False(如果不可能)

Python 给定一个整数列表,将其拆分为两个列表,如果相等,则返回True,否则返回False(如果不可能),python,Python,和以前一样,我得到了一个字符串列表,我必须将一个列表拆分为两个列表,以检查是否可能有相等的和。如果可能,返回数组1和数组2 以下代码适用于一组组合 例如,myArr=[1,2,3,4] 每个完整的迭代将执行以下操作(targetSum=sum(myArr)/2)#5 #1:PartialArr1=[1],PartialArr2=[2,3,4],检查Arr1==targetSum #1:PartialArr1=[1,2],PartialArr2=[3,4],检查Arr1==targetSum #1

和以前一样,我得到了一个字符串列表,我必须将一个列表拆分为两个列表,以检查是否可能有相等的和。如果可能,返回数组1和数组2

以下代码适用于一组组合

例如,myArr=[1,2,3,4]

每个完整的迭代将执行以下操作(targetSum=sum(myArr)/2)#5

#1:PartialArr1=[1],PartialArr2=[2,3,4],检查Arr1==targetSum

#1:PartialArr1=[1,2],PartialArr2=[3,4],检查Arr1==targetSum

#1:PartialArr1=[1,2,3],PartialArr2=[4],检查Arr1==targetSum

#1:PartialArr1=[1,2,3,4],PartialArr2=[],检查Arr1==targetSum

当#1不返回任何真值时,请将数字置换一次

#2:myArr=[2,3,4,1]

#2:PartialArr1=[2],PartialArr2=[3,4,1],检查Arr1==targetSum

#2:PartialArr1=[2,3],PartialArr2=[4,1],检查Arr1==targetSum#返回PartialArr1,PartialArr2

def group(s):

    sumOfArr = sum(s)
    isPossible = sumOfArr%2

    if(isPossible == 0):
        #No remainder, possible to get a combination of two equal arrays
        targetSum = int(sumOfArr/2)

        partialArr1 = []
        partialArr2 = []
        i = 0
    
        while(targetSum != sum(partialArr1)):
            partialArr1.append(s[i])
            partialArr2 = s[i+1:]
        
            i+=1
        
            if(i == len(s)-1) or (sum(partialArr1) > targetSum):
                partialArr1 = []
                partialArr2 = []
                i = 0
                s = s[1:] + s[:1]

        return partialArr1,partialArr2
    else:
        #Not possible, return None, None
        return None, None
虽然我的解决方案适用于大多数置换组,但它不适用于以下情况:

#The following works with my code ->
#s = [135, 129, 141, 121, 105, 109, 105, 147]
#s = [-14, 3, 4, 13, -1, -5, 0, 5, -10, 8, -4, 10, -12, 11, 9, 12, -6, -11, -9, -8]
#s= [-1, 1, 4, 2, 8, 0]
#s = [10, 2,2,10, 2, 2, 2,10]


#SOLUTION SHOULD RETURN THE FOLLOWING
#s1 = [6, 10, 6, 10], sum(s1) = 32
#s2 = [7, -3, 1, -4, 2, 2, 7, -3, 2, 4, 0, 7, 6, -2, -4, 10], sum(s1) = 32


s = [7, -3, 6, 1, 10, -4, 2, 2, 6, 7, -3, 2, 4, 0, 7, 6, -2, 10, -4, 10]

group(s) #This does not work because it does not permutate all possible ways of len(s)^2 ways. Thus I am stucked at this point of time

任何帮助都将不胜感激!!谢谢

根据我的理解,你需要看看你的数组是否可以被分成两个相等的数组,并返回
True
如果你返回
False
,你不需要它被分成的数组,只需要它可以被分成

如果你的数组可以分成两个相等的数组,那么它的一些元素的总和应该是数组总和的一半

例如:

[5,3,5,2,10,1]
此数组的和为26。如果它的一些元素可以等于13,那么它可以被分成两个相等数组的数组,因为其余元素的总和也将为13<代码>示例:[10,3]和[5,5,2,1],因此当您发现数组的元素组合等于整个数组的一半时,返回True。同样,具有奇数和的数组也不能自动划分为2个相等的数组。注意:搜索所有的组合具有很高的复杂性,并且对于大的列表会很慢

这正是我正在做的,使用itertools获得的组合总和为数组总总和的一半,如果有组合,则可以将其划分为2个相等的数组,测试它:

import itertools
numbers = [135, 129, 141, 121, 105, 109, 105, 147]


if((sum(numbers)%2)!=0):
    print(False)
else:
    result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == (sum(numbers)//2)]
    if len(result)>1:
        print(True)
    else:
        print(False)

这是您需要的函数,当数组可以分成两个相等的数组时,它返回True;如果不能,则返回False,而不使用任何库:

def search(numbers):
    target = sum(numbers)/2
    def subset_sum(numbers, target, partial=[]):
        s = sum(partial)

        if s == target:
            print(5/0)
        if s >= target:
            return 

        for i in range(len(numbers)):
            n = numbers[i]
            remaining = numbers[i + 1:]
            subset_sum(remaining, target, partial + [n])
    try:
        subset_sum(numbers, target)
        return False

    except:
        return True

numbers = [135, 129, 141, 121, 105, 109, 105, 147]
print(search(numbers))

while循环只测试数组的一个分割,而问题(和示例)表明需要测试许多(如果不是全部)组合。因此,解决方案将取决于上下文(这个问题是蛮力算法讲座的一部分,使用组合?动态规划?还是贪婪的解决方案可以接受?)嗨,我使用的方法没有要求,但是我已经编辑了我的答案,请看一看,现在我正在做多个排列[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,3,2,1]谢谢你的回答!但是,遗憾的是,我不允许为这个问题导入任何库…因此,我对如何导入和库很感兴趣。我添加了第二个答案,没有使用库,只是一个递归函数来检查所有组合,一旦发现一个组合,当对其进行求和时,返回true,它等于al的和l个数组/2,它更快更好,工作完美无瑕,请查看。谢谢,我已经尝试过了,但我正在尝试修改它在嵌套函数中不运行的代码~但是,我修改的代码不允许我在找到答案时跳出循环。如果trueHi Elyes,我也在尝试返回数组更新了我的关键答案+帖子,您是否可以快速查看,看看是否有任何解决方案,因为目前我面临一些问题。我会在我的主要QN中注意到这个问题