2015-08-16 4 views
-4

я должен найти максимальную сумму элементов в массиве (или их переставляются форма), значение элементов зависит от их позиции в массивеНахождение максимальной суммы элементов данного массива

Алгоритм для нахождения сумма конкретного массива следующим образом

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 

, пожалуйста, помогите мне разрешения ошибки в моих сотрудников де.

+2

'= +' не делает то, что вы думаете. он должен быть '+ ='. –

+0

Почему вы используете цикл while и просто возвращаетесь после одного цикла? –

+0

Я думаю выпуск есть с отступом. Последний возврат должен быть деиндексирован одним шагом. Таким образом, это не должно быть частью цикла while. –

ответ

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, чтобы избежать необходимости делать это вычитание в другом порядке.

+1

'permutations (input_list, len (input_list))' ==> просто 'перестановки (input_list)' – itzMEonTV

Смежные вопросы