查找给定数组的最大元素总和

时间:2015-08-16 17:38:17

标签: python

我必须找到数组中元素的最大总和(或它们的置换形式),元素的值取决于它们在数组中的位置

用于查找特定阵列的总和的算法如下

int taste = 0
for (int i= 0; i <= N; i++){
    if (p[i]) - p[i-1]) >= 0):
        taste += i * (p[i]) - p[i - 1])
    else:
        taste += i * (p[i - 1] - p[i])

我的解决方案是在python中,但我总是得到结果为0

from itertools import permutations
def sum_permuatations ():
    t = int(input())
    taste = 0
    maxTaste = 0
    while ( t!=0):
        t = t-1
        lent = input()
        lis = input()

        for p in permutations(lis, len(lent)):
            for i in range(2,len(p)+1):
                if (int(p[i]) - int(p[i-1]) >= 0):
                    taste += i*(int(p[i])-int(p[i-1]))
                else:
                    taste += i*(int(p[i-1])- int(p[i]))
            if taste > maxTaste:
                maxTaste = taste
        return maxTaste

请帮我解决代码中的错误。

1 个答案:

答案 0 :(得分:1)

此解决方案还使用itertools库生成各种排列。对于这些中的每一个,然后可以通过使用zip来计算列表中的连续数字对来计算最大相邻和公式。 enumerate函数用于给出每对的位置。

import itertools

input_list = [10, 15, 16]
result = []

for perm in itertools.permutations(input_list):
    sum_diff = 0
    for i,pair in enumerate(itertools.izip(perm[:-1], perm[1:])):
        sum_diff += abs(pair[0]-pair[1]) * (i+2)
    result.append((sum_diff, perm))

result.sort()
print result[-1]

哪会产生以下结果:

(28, (15, 10, 16))

或者如果您打印整个列表:

[(13, (10, 15, 16)), (15, (10, 16, 15)), (17, (16, 15, 10)), (20, (15, 16, 10)), (27, (16, 10, 15)), (28, (15, 10, 16))]

您的解决方案存在一些小问题,使用range将从0开始。对于每个排列,taste也需要归零,如下所示:

from itertools import permutations

def sum_permuatations(lis):
    maxTaste = 0

    for p in permutations(lis):
        taste = 0
        for i in range(1,len(p)):
            if (int(p[i]) - int(p[i-1]) >= 0):
                taste += (i+1)*(int(p[i]) - int(p[i-1]))
            else:
                taste += (i+1)*(int(p[i-1]) - int(p[i]))

        if taste > maxTaste:
            maxTaste = taste

    return maxTaste

input_list = [10, 15, 16]
print sum_permuatations(input_list) 

您需要对其进行编辑以提示输入,这使测试更容易。您可以对其进行编辑以使用abs命令,以避免需要以不同的顺序进行此减法。