Re: Очень надо.
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 22.03.03 06:05
Оценка:
В смысле — максимизировать цену, не превышая макс. массу?
В случае, когда каждый груз в единственном экземпляре, а диапазон весов не слишком велик, задача решается методом динамического программирования. Читайте всякие топики "задача о загрузке рюкзака", "... загрузке машины и т.п.". Как решается в случае множественности — уже не помню, а вспоминать нет времени

Вкратце идея такова: пусть первые N грузов уже уложены оптимально (вернее, пусть есть только первые N грузов и для них задачи с ограничением по весу от 0 до изначально стоящего перед нами ограничения MaxWeightПоУсловию уже решены). Тогда добавим в задачу N+1-й груз и зададимся каким-то новым ограничением MaxWeight. Если мы его(груз) берем, то оптимальное решение новой задачи будет равно Price[N+1]+решение задачи MaxPrice(N,MaxWeight-Weight[N+1]), то есть решению уже рассмотренной ранее подзадачи для N грузов и макс. веса MaxWeight-Weight[N+1]. Если же новый груз не берем, то оптимальное решение равно MaxPrice(N,MaxWeight). То есть для данного maxWeight надо из этих 2 вариантов выбрать максимум.

Теперь пускаем цикл (при том же значении N+1) MaxWeight=0..MaxWeightПоУсловию и для каждого из осуществляем такой выбор максимума из 2 вариантов (ясно, что иногда может оставаться лишь 1 вариант — например, когда кроме N+1 груза, если его взять, не влезет вообще ничего). Получаем линейку решений уже для N+1 грузов и MaxWeight=0..MaxWeightПоУсловию.
Потом увеличиваем N и повторяем процедуру.
Результаты решения подзадач удобно хранить в таблице.

В конце надо будет взять клетку MaxPrice(Nгрузов, MaxWeightПоУсловию) и пройти "назад" по таблице, на каждом шаге из двух кандидатов, из которых мы могли попасть в текущую клетку, легко можно выбрать того, из которого мы в действительности в нее пришли (опять сравнить два варианта). Так получим, какие грузы мы брали, а какие-нет.

Надеюсь, не слишком сумбурное объяснение? Если что, пишите gmm@bashnet,ru.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.