问题描述
和以前一样,我得到了一个字符串列表,我必须将那个 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))