Как указал Йохен Ритцель , это можно рассматривать как пример проблемы с рюкзаком .
Как правило, у вас есть набор объектов, которые имеют как «вес» («вторая категория», в вашем примере), так и «значение» (или «стоимость», если это проблема минимизации).
Проблема состоит в том, чтобы подобрать подмножество объектов таким образом, чтобы сумма их «значений» была максимизирована / минимизирована, при условии ограничения сумма весов не может превышать указанный максимум.
Хотя проблема в общем неразрешима, если ограничение на максимальное значение для суммы весов является фиксированным, существует полиномиальное временное решение, использующее динамическое программирование или памятка .
Очень широко идея состоит в том, чтобы определить набор значений, где
C ij обозначает максимальную сумму («значений»), достижимую с учетом только первых i объектов, где общий вес (выбранного подмножества) не может превышать j .
Здесь есть два возможных варианта вычисления C ij .
любой элемент i включается в подмножество, а затем
C ij = значение i + C i-1, вес j я
или элемент i не входит в подмножество выбранных объектов, поэтому
C ij = C i-1, j
Необходимо выбрать максимум из двух.
Если n - это количество элементов, а w - это максимальный общий вес, то ответ заканчивается на C nw .