Алгоритм поиска минимального числа N для разделения значений стека на X подмножеств с суммой меньше N

У меня есть стек с объектами целочисленных значений. Я хочу купить грузовик вместимостью N (N неизвестно), чтобы быть уверенным, что смогу перевезти все объекты максимум за X кругов.

Х известен. Другими словами, я должен разбить стек (порядок объектов должен поддерживаться) в максимальных X подмножествах с суммой меньше N и найти это минимальное N.

Не могли бы вы помочь мне с алгоритмом или идеей, пожалуйста? Спасибо.


person Claudinho18    schedule 09.05.2018    source источник
comment
Я думаю, вы хотите найти минимальное значение N, потому что N = сумма (всего стека) является тривиальным решением вашей проблемы.   -  person Alessandro Teruzzi    schedule 09.05.2018
comment
См., например, эту статью для некоторых указателей (ссылка бесстыдно украдена из проблемы разделения Википедии страница)   -  person hlt    schedule 09.05.2018
comment
Да. Минимальное значение N. Спасибо.   -  person Claudinho18    schedule 09.05.2018


Ответы (1)


Если, как вы утверждаете, «порядок объектов должен поддерживаться», то мы можем решить это с помощью бинарного поиска по N, по O(|objects| * log m), где m — общая сумма.

Бумага @hlt, на которую ссылается комментарий, о многостороннем разделении номеров, будет применяться, если порядок объектов можно изменить. В этом случае, когда порядок фиксирован, мы можем просто попробовать разные N, максимально упаковав разделы. Если выбранное нами N слишком мало, мы превзойдем X. Это делает N упорядоченным и, следовательно, доступным для поиска.

person גלעד ברקן    schedule 09.05.2018
comment
Из прошлого опыта, вероятно, люди, следующие за тегом C++, думают, что вопрос является домашним заданием или что-то в этом роде. Я проголосовал. - person David Eisenstat; 10.05.2018