Вы можете решить эту проблему с помощью динамического программирования.
weight[i] := weight of box i
strength[i] := strength of box i
N(w,b) := maximum number of boxes you can stack <= weight w with box b on bottom
Обратите внимание, что для вычисления N(w,b)
вы ставите поле b
внизу.Затем вы рассчитываете максимальное количество коробок, которое вы можете положить поверх него.Что ж, это легко сделать, если вы перебираете возможные ящики, которые могут быть помещены над ним.
Тогда у вас будет отношение повторения:
N(w,b) = 1+max{ N( min(w-weight[b],strength[b]),i ) }
Тогда ваш ответ: max{ N(W,b) }
гдеW=sum(weight[i])
.