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