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

问题描述

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

以下代码适用于一组组合

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

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

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

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

虽然#1 不返回任何 True 值,但将数字排列一次

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

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

#2: PartialArr1 = [2,PartialArr2 = [4,检查 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,147]
#s = [-14,13,-1,-5,5,-10,8,-4,10,-12,11,9,12,-6,-11,-9,-8]
#s= [-1,1,0]
#s = [10,10]


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


s = [7,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

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

解决方法

据我了解,你需要看看你的数组是否可以分成2个相等的数组,如果可以则返回True,否则返回False,你不需要它得到的数组划分为,只是它可以划分的事实。

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

例如:

[5,3,5,2,10,1]

这个数组的总和为26。如果它的一些元素可以等于13,那么它可以分成2个相等数组的数组,因为其余元素的总和也为13。 example : [10,3] and [5,1],因此当您发现数组元素的组合等于整个数组总和的一半时,您将返回 True。同样自动地,具有奇数和的数组不可整除为 2 个相等的数组。注意:搜索所有组合的复杂度很高,对于大列表会很慢。

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

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


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

这是你需要的函数,当数组可以被分成 2 个相等的数组时,它返回 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,partial + [n])
    try:
        subset_sum(numbers,target)
        return False

    except:
        return True

numbers = [135,147]
print(search(numbers))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...