Программа курса:
Разбор задачи: Максимальное количество единиц на грузовом автомобиле
Предложенный нами код решения:
def maximumUnits(boxTypes, truckSize):
"""
Возвращает максимальное количество единиц, которые можно погрузить на грузовик.
:param boxTypes: Список типов коробок, каждый элемент представляет [количество коробок, количество единиц в каждой коробке]
:param truckSize: Максимальное количество коробок, которые можно погрузить на грузовик
:return: Максимальное количество единиц, которые можно погрузить на грузовик
"""
# Сортируем коробки по убыванию количества единиц на коробку
boxTypes.sort(key=lambda x: x[1], reverse=True)
total_units = 0
for boxes, units in boxTypes:
if truckSize == 0:
break
# Берем столько коробок, сколько можем, но не превышаем вместимость грузовика
boxes_to_take = min(boxes, truckSize)
total_units += boxes_to_take * units
truckSize -= boxes_to_take
return total_units
- Инициализация функции: Функция
maximumUnitsпринимает два аргумента:boxTypes: Список, где каждый элемент представляет собой пару[numberOfBoxes, numberOfUnitsPerBox], т.е. количество коробок и количество единиц в каждой коробке.truckSize: Максимальное количество коробок, которые можно погрузить на грузовик.
- Описание алгоритма: Алгоритм решает задачу по жадному принципу, т.е. выбирает коробки, которые могут максимально увеличить общее количество единиц, заполняя грузовик.
Шаг 1: Сортировка коробок
boxTypes.sort(key=lambda x: x[1], reverse=True)
Разбор фрагмента:
- Здесь используется сортировка списка
boxTypes. Сортировка происходит по убыванию количества единиц на коробку (второй элемент каждого подсписка). lambda x: x[1]указывает, что сортировать нужно по второму элементу каждого подсписка (количество единиц в коробке).reverse=Trueозначает, что сортировка будет происходить по убыванию, то есть сначала будут идти коробки с наибольшим количеством единиц.
Пример: Если входной список коробок будет таким:
boxTypes = [[1, 3], [2, 2], [3, 1]]
После сортировки он станет:
boxTypes = [[1, 3], [2, 2], [3, 1]]
Коробки с большим количеством единиц окажутся в начале списка.
Шаг 2: Наполнение грузовика
total_units = 0
Разбор фрагмента:
- Инициализируется переменная
total_units, которая будет хранить общее количество единиц, загруженных на грузовик.
Шаг 3: Итерация по коробкам
for boxes, units in boxTypes:
if truckSize == 0:
break
Разбор фрагмента:
- Начинается цикл по всем типам коробок в отсортированном списке.
- Если на каком-то шаге количество оставшихся коробок (
truckSize) становится равным 0, это значит, что грузовик уже полностью загружен, и цикл можно прервать.
Шаг 4: Выбор коробок
boxes_to_take = min(boxes, truckSize)
total_units += boxes_to_take * units
truckSize -= boxes_to_take
Разбор фрагмента:
boxes_to_take = min(boxes, truckSize)— на этом шаге мы выбираем минимальное количество коробок между тем, сколько коробок есть у текущего типа, и тем, сколько еще можно положить в грузовик.total_units += boxes_to_take * units— добавляем количество единиц, которое помещается в выбранное количество коробок, к общему числу единиц на грузовике.truckSize -= boxes_to_take— уменьшаем оставшуюся вместимость грузовика на количество выбранных коробок.
Шаг 5: Возвращаем результат
return total_units
Разбор фрагмента:
- Функция возвращает общее количество единиц, которое удалось загрузить на грузовик.
Пример работы алгоритма
Рассмотрим пример с входными данными:
boxTypes = [[1, 3], [2, 2], [3, 1]]
truckSize = 4
1. Сортировка коробок: После сортировки по количеству единиц на коробку, список boxTypes станет:
[[1, 3], [2, 2], [3, 1]]
2. Заполнение грузовика:
- Сначала мы выбираем коробки с наибольшим количеством единиц. У нас есть 1 коробка с 3 единицами, и грузовик может взять 4 коробки, так что мы берем эту коробку:
total_units = 1 * 3 = 3truckSize = 4 - 1 = 3
- Далее мы берем 2 коробки с 2 единицами:
total_units += 2 * 2 = 7truckSize = 3 - 2 = 1
- Наконец, мы берем одну коробку с 1 единицей:
total_units += 1 * 1 = 8truckSize = 1 - 1 = 0
- Грузовик полностью заполнен.
3. Результат: Функция возвращает total_units = 8.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии