Алгоритм поиска самой длинной комбинации, сумма которой меньше или равна значению

#python #python-3.x #computer-science

#python #python-3.x #информатика

Вопрос:

У меня есть список кортежей (фактический список может быть очень большим), первый элемент в кортеже указывает индекс, а второй указывает значение. У меня также есть число n :

 lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
n = 6
  

Я хочу найти самую большую комбинацию, которая даст мне сумму значений, которая меньше или равна n . Итак, в этом примере ответом должен быть список, подобный следующему:

 [(0,1), (1,2), (4,1), (5,2)]
  

потому что 1 2 1 2 = 6 это самая большая комбинация значений в lst , которая дает сумму, которая меньше или равна n .

Мне нужно найти что-то, что работает со списками, скажем, с 200-300 элементами, по крайней мере.

Ответ №1:

Используя копию списка, отсортированного в порядке возрастания значения, накапливайте кортежи до тех пор, пока общая сумма не превысит целевую, а затем отсортируйте обратно в порядке индекса.

 lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
n = 6

total = 0
answer = []
for tup in sorted(lst, key=lambda t:t[1]):
    val = tup[1]
    if total   val > n:
        break
    answer.append(tup)
    total  = val

answer.sort(key=lambda t:t[0])
    
print(answer)
  

Дает:

 [(0, 1), (1, 2), (4, 1), (5, 2)]
  

Ответ №2:

Начните с сортировки кортежей по значению, затем возьмите столько, сколько сможете, оставаясь при этом ниже предела:

 from operator import itemgetter

lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
n = 6

sorted_list = sorted(lst, key=itemgetter(1))

out = []
total = 0

for index, value in sorted_list:
    total  = value
    if total <= n:
        out.append((index, value))
    else:
        break
        
print(out)
# [(0, 1), (4, 1), (1, 2), (5, 2)]
  

Ответ №3:

 lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]

n = 5

sorted_lst_second_element = sorted(lst, key=lambda x: x[1])

sum = 0
max_sum_list = []
for i in range (len(lst) - 1):
    sum = sum   sorted_lst_second_element[i][1]
    if sum<=n:
        max_sum_list.append(sorted_lst_second_element[i])
    else:
        break

print(sorted_lst_second_element)
print(max_sum_list)