在python中循环?

在python中循环?,python,iteration,Python,Iteration,我试图在coderbyte的easy部分解决这个问题,提示是: 让函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true,否则返回字符串false。例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。数组不会为空,不会包含所有相同的元素,并且可能包含负数 这是我的解决办法 def ArrayAddition(arr): arr = sorted(arr, re

我试图在coderbyte的easy部分解决这个问题,提示是:

让函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true,否则返回字符串false。例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。数组不会为空,不会包含所有相同的元素,并且可能包含负数

这是我的解决办法

def ArrayAddition(arr):
arr = sorted(arr, reverse=True)
large = arr.pop(0)
storage = 0
placeholder = 0
for r in range(len(arr)):
    for n in arr:
        if n + storage == large: return True
        elif n + storage < large: storage += n
        else: continue
    storage = 0
    if placeholder == 0: placeholder = arr.pop(0)
    else: arr.append(placeholder); placeholder = arr.pop(0)
return False
我已经搜索了所有地方,找到了itertool的建议,但是我想知道是否有一种方法可以更原始地编写这段代码


谢谢。

更新:我忘了你想检查所有可能的组合。改用这个:

def ArrayAddition(l):
    for length in range(2, len(l)):
        for lst in itertools.combinations(l, length):
            if sum(lst) in l:
                print(lst, sum(lst))
                return True
    return False
一套解决方案:

>>> any(any(sum(lst) in l for lst in itertools.combinations(l, length)) for length in range(2, len(l)))
def GetSum(n, arr):
    if len(arr) == 0 and n != 0:
        return False
    return (n == 0 or  
      GetSum(n, arr[1:]) or  
      GetSum(n-arr[0], arr[1:]))

def ArrayAddition(arr):
    arrs = sorted(arr)
    return GetSum(arrs[-1], arrs[:-1])

print ArrayAddition([2,95,96,97,98,99,100])

希望这有帮助

您的解决方案不起作用

>>> ArrayAddition([10, 11, 20, 21, 30, 31, 60])
False
简单的解决方案是使用
itertools
迭代输入的所有子集(不包含最大数):

如果要避免使用itertools,则需要直接生成子集。这可以通过二进制计数和使用设定位来确定要拾取的元素来实现:

def subsetsum(l):
    l = list(l)
    target = max(l)
    l.remove(l)
    for subset_index in xrange(2**len(l)):
        subtotal = 0
        for i, num in enumerate(l):
            # If bit i is set in subset_index
            if subset_index & (1 << i):
                subtotal += num
        if subtotal == target:
            return True
    return False
def子系统(l):
l=列表(l)
目标=最大值(l)
l、 删除(l)
对于xrange(2**len(l))中的子集_索引:
小计=0
对于i,枚举中的num(l):
#如果在子集_索引中设置位i
如果子集索引&(1为递归解:

>>> any(any(sum(lst) in l for lst in itertools.combinations(l, length)) for length in range(2, len(l)))
def GetSum(n, arr):
    if len(arr) == 0 and n != 0:
        return False
    return (n == 0 or  
      GetSum(n, arr[1:]) or  
      GetSum(n-arr[0], arr[1:]))

def ArrayAddition(arr):
    arrs = sorted(arr)
    return GetSum(arrs[-1], arrs[:-1])

print ArrayAddition([2,95,96,97,98,99,100])
当所需和为非零且数组中没有项时,GetSum函数返回False。然后检查3种情况:

  • 如果所需的和n为零,则实现目标
  • 如果我们能在第一个项目被删除后得到剩余项目的总和,那么目标就实现了
  • 如果我们能得到所需的总和减去列表其余部分的第一个元素,那么目标就实现了

  • 生成功率集的所有总和,并根据最大值进行测试

    def ArrayAddition(L):
        return any(sum(k for j,k in enumerate(L) if 1<<j&i)==max(L) for i in range(1<<len(L)))
    
    def阵列添加(L):
    
    返回任意(和)(k代表j,k在枚举(L)中,如果1还有一种方法

    代码:

    import itertools
    def func(l):
        m = max(l)
        rem = [itertools.combinations([x for x in l if not x == m],i) for i in range(2,len(l)-1)]
        print [item for i in rem for item in i if sum(item)==m ]
    
    
    if __name__=='__main__':
        func([1,2,3,4,5])
    
    [(1, 4), (2, 3)]  
    
    输出:

    import itertools
    def func(l):
        m = max(l)
        rem = [itertools.combinations([x for x in l if not x == m],i) for i in range(2,len(l)-1)]
        print [item for i in rem for item in i if sum(item)==m ]
    
    
    if __name__=='__main__':
        func([1,2,3,4,5])
    
    [(1, 4), (2, 3)]  
    

    希望这有帮助。:)

    如果我正确理解了问题,只需返回您想要的:

    2*max(a)<=sum(a)
    

    2*max(a)Google for subset sum,这应该让您开始了。顺便说一句,您所调用的数组不是数组。它们是列表(精确地说是ArrayList,但仍然是列表)。在Python中,“数组”通常指的是NumPy数组,它是一种不同的数据结构。嗯?你是什么意思?我对递归不太了解,但这是我必须开始学习的东西,谢谢!添加一个解释可能对OP非常有用。另外,你可能应该使用
    .sort()
    而不是
    .sorted())
    。不过这是一个不错的解决方案。我不明白为什么当它循环到if语句中时,函数不会停止并返回false。相反,它会继续循环。(例如,当n=100和arr=[]对不起,我相信你没有正确理解这个问题:)嗯,这就是我怀疑的:)