Выходит за размер массива

Почему выходит за размер массива? Смотрю по точкам останова, keep,i,dlist[i] или равно или меньше, чем макс.элемент

from random import randint

zak= int(input('Количество заказов: '))
n = zak #int(input("Количество дней в дедлайне: "))
lst2 = []
dlst = []
info = []
summ = 0
d = 0

for i in range (n,0,-1):
    k = int(input('Введите кол-во дней в дедлайне:'))
    d+= int(k)
    dlst.append(d)
    for j in range(d):
        lst2.append(i)
lst = [randint (10,100) for fe in range(len(dlst))]

for i in range(len(lst)):
    info.append([lst[i],lst2[i]])
for i in range(n):
    maxnum = 0
    b = 0
    for keep in range(dlst[i]):
        if maxnum <= info[keep][0]: #--[Ошибка]list index out of range--#
            if len(info[keep])<3:
                maxnum = info[keep][0]
                b = keep
        if keep == dlst[i] - 1:
            summ += maxnum
            info[b].append(" - на данном варианте, мы получим максимальную прибыль.")
for i in reversed(info):
    print(*i)
print("Мы получили прибыль: ", summ)

Задача о расписании: у программиста есть n заказов. Для каждого заказа известен его дедлайн, di, это срок, до которого нужно выполнить заказ, и известна стоимость заказа - ci. На выполнение каждого заказа программист тратит один день, он начинает выполнять заказы в первый день и заказ с дедлайном di ему нужно выполнить до конца di дня, то есть, например, если у заказа дедлайн 1, его нужно выполнить до конца первого дня. Нужно составить оптимальное расписание, то есть определить, какие заказы программист будет выполнять и в какие дни так, чтобы заработать как можно больше денег, иначе говоря, нужно максимизировать суммарную стоимость выполненных заказов


Ответы (1 шт):

Автор решения: handowl

Если коротко, то ошибка в том, что Вы добавляете в info ровно столько списков, сколько у вас заказов. Допустим, три заказа, на первый дается 100 дней. Что будет в таком случае в info? Правильно, список из трех списков. Что же будет в dlst? Первый элемент - 100(дней на первый заказ), второй - 100+(сумма дней на первый заказ и на второй) и так до трех. Что это означает? В строке for keep in range(dlst[i]): значение переменной keep сначала может доходить до 100, а потом и того больше. А в инфо только три списка, сотни там нет...

Очевидная проблема в том, что Вы и сами запутались. Неочевидная - в коде, потому как и код не очевиден. В лоб решение - это избавиться от больших значений из списка dlst, а взять for keep in range(len(dlst)). Вот и все, ошибки нет. Но прибыль нулевая.

→ Ссылка