Я пытаюсь придумать разумный алгоритм для этой проблемы:
Допустим, у вас есть куча мячей. Каждый шар имеет как минимум один цвет, но может быть и разноцветным. Каждый шар имеет вес и связанную с ним ценность. Есть также куча коробок, каждая из которых только одного цвета. В каждой коробке указано максимальное количество шаров, которое она может вместить. Цель состоит в том, чтобы максимизировать сумму значений в ячейках, не превышая некоторого общего веса, W, и единственное правило:
Чтобы поместить мяч в коробку, на нем должен быть как минимум цвет коробки.
(Например, вы можете положить сине-зеленый шарик в синюю или зеленую коробку, но не в красную коробку.)
Я провел некоторое исследование, и это похоже на проблему рюкзака, а также похоже на решение с помощью венгерского алгоритма, но я не могу свести это ни к одной из проблем.
Мне просто любопытно, есть ли какой-то алгоритм динамического программирования для такого типа задач, чтобы сделать его решаемым за полиномиальное время, или это просто замаскированная проблема коммивояжера. Помогло бы мне, если бы я знал, что существует не более X цветов? Любая помощь приветствуется. Я также мог бы немного формализовать проблему с именами переменных, если это поможет. Спасибо!
Вот простой пример:
Максимальный вес: 5
Мячи:
1 красный шар - (значение = 5, вес = 1)
1 синий шар - (значение = 3, вес = 1)
1 зеленый/красный/синий шар - (значение = 2, вес = 4)
1 зеленый/синий шар - (значение = 4, вес = 1)
1 красный/синий шар - (значение = 1, вес = 1)
Коробки:
1 красный (вмещает 1 мяч)
1 синий (вмещает 2 мяча)
1 зеленый (вмещает 1 мяч)
Оптимальное решение:
красный шар в красной коробке
синий шар и красный/синий шар в синей коробке
зеленый/синий шар в зеленой коробке
Общее значение: 13 (5 + 3 + 1 + 4)
Общий вес: 4 (1 + 1 + 1 + 1)
Примечание: несмотря на то, что зеленый/красный/синий мяч был более ценным, чем красный/синий мяч, его вес привел бы к превышению лимита.
Изменить:
Один уточняющий момент: шары одной цветовой комбинации не обязательно будут иметь одинаковый вес и ценность. Например, у вас может быть красный шар со значением 3 и весом 1, а другой красный шар со значением 2 и весом 5.
Редактировать 2:
Мы можем принять целые веса и значения, если это поможет нам придумать алгоритм динамического программирования.