我必须找到数组中元素的最大总和(或它们的置换形式),元素的值取决于它们在数组中的位置
用于查找特定阵列的总和的算法如下
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
请帮我解决代码中的错误。
答案 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
命令,以避免需要以不同的顺序进行此减法。