Упаковка предметов с двух концов ряда в несколько грузовиков
В ряду есть предметы, которые нужно поместить в несколько грузовиков. Вес предметов и количество грузовых автомобилей и их общая вместимость приведены. Предметы можно перемещать в грузовики только с двух концов ряда. Как мы можем определить максимальное количество предметов, которые можно поместить в грузовики?
(Максимум 10000 предметов и 100 грузовиков.)
Пример:
Предметы: (20, 70, 10, 30, 80, 60, 50, 30)
Количество грузовых автомобилей: 3
Вместимость грузовых автомобилей: 100
Здесь мы можем разместить до 7 предметов, например, так:
item to truck remaining
20 1 (70, 10, 30, 80, 60, 50, 30)
30 2 (70, 10, 30, 80, 60, 50)
70 2 (10, 30, 80, 60, 50)
50 1 (10, 30, 80, 60)
10 3 (30, 80, 60)
30 1 (80, 60)
60 3 (80)
Моя идея состояла бы в том, чтобы попытаться заполнить все грузовики как можно больше, но проблемы с упаковкой для меня новы, и я очень мало знаю о них.
1 ответ
Проблема действительно может быть решена с помощью динамического программирования; Однако это может быть трудно без предыдущего опыта с подходом. Отношение рекуррентности и пространство состояний можно определить следующим образом.
Позволять n
обозначить количество предметов и i_1,...,i_n
их размеры; позволять m
обозначим количество грузовиков и пусть c_1,...,c_m
обозначить их возможности. Пространство состояний может быть реализовано как m+2
таблица, где вход в позицию (k_1,k_2,l_1,...,l_m)
определяется как максимально возможное количество предметов, выбранных из дополнения предметов {k_1,...,k_2}
(который тогда является оставшейся очередью предметов), где грузовик k
имеет оставшийся груз точно l_k
или отрицательной бесконечности такого решения не существует. После инициализации состояний, соответствующих базовым случаям, пространство состояний может быть оценено итеративно с использованием рекуррентного отношения
(k_1,k_2,l_1,...,l_m) = max
{
(k_1+1,k_2,l_1,...,l_m),
(k_1,k_2+1,l_1,...,l_m),
(k_1+1,k_2,l_1-i_k_1,...,l_m) + 1, m cases in total
...,
(k_1+1,k_2,l_1,...,l_m-i_k_1) + 1,
(k_1,k_2-1,l_1-i_k_2,...,l_m) + 1, m cases in total
...,
(k_1,k_2-1,l_1,...,l_m-i_k_2) + 1,
}
где первые два случая соответствуют отбрасыванию левого конца и правого конца очереди, следующий m
случаи соответствуют упаковке товара в левом конце очереди к каждому из m
грузовики и последнее m
случаи соответствуют упаковке товара в правом конце очереди к каждому из m
грузовые автомобили.
После оценки пространства состояний необходимо изучить все конечные состояния; это те, в которых каждый предмет либо упакован, либо выброшен. Эти государства те, для которых k_1 = k_2-1
держит, то есть очередь будет пустой. Реализация будет принимать максимальное значение из них; если результат отрицательный бесконечность, никакого допустимого решения не существует.