Динамическое Программирование Найти Все Возможные Комбинации Команд
Я пытался решить задачу, в которой мне нужно вычислить количество возможных командных образований для случайного вида спорта.
Входные данные примерно такие:
P → Number of Team Players
R → Roles
[Min, Max] → Role 0
[Min, Max] → Role 1
...
[Min, Max] → Role r-1
----------
Min= Minimum number of Players for the Role
Max= Maximum number of Players for the Role
Возьмем к примеру Спорт1. Допустим, Sport1 - это 3 типа ролей (A, B, C), теперь представим, что в каждой команде по 8 игроков.
8 → Number of Team Players
3 → Roles
[3 , 7] → Role A
[1 , 5] → Role B
[0 , 2] → Role C
Допустимых команд: [
3-5-0
,3-4-1
,3-3-2
,4-4-0
,4-3-1
,4-2-2
,5-3-0
,5-2-1
,5-1-2
,6-2-0
,6-1-1
,7-1-0
]Число действует группа формаций: 12
Я уже решил эту задачу, Перейдя на каждую возможную формацию, и если сумма игроков в каждой роли равна числу игроков команды, то добавьте один к конечному результату. В противном случае добавьте ноль a. k. a. сделайте то же самое для следующей комбинации, пока не будет достигнут конец.
3+5+0 = 8 → действительное формирование команды .
3+5+1 > 8 → недопустимое формирование команды
3+4+0 инвалидная команда формирование
Это все забавы и игры, пока количество игроков не достигнет примерно 40, а количество ролей - примерно 20, а Min = 0 и Max = 40 для каждой роли.
Пример:
40
20
[0; 40] → Role A
[0; 40] → Role B
...
[0; 40] → Role T
В этом случае мне нужно было бы проверить 40^20 возможных образований, для которых я уже сделал некоторые сокращения, сделав только для роли a 0, а затем умножить на 20, но все еще нужно проверить 40^19 различных комбинаций.
Эта проблема должна быть решена. использование динамического программирования. Я уже использовал DP для решения некоторых проблем(проблемы последовательности, максимальная прибыль клубничных ящиков), но, похоже, не могу найти способ решить эту проблему.
Может ли кто-нибудь пролить свет на то, как решить эту проблему и/или аналогичные проблемы, которые я мог бы найти в интернете или в книге, которая могла бы помочь мне найти решение DP для этого?
1 ответ:
Задачи динамического программирования обычно заканчиваются тем, что вы упорядочиваете части задачи в последовательности, так что вы можете работать с ними слева направо, выполняя достаточно работы на этапе n, чтобы вы могли ссылаться на нее для получения всей информации на этапе n+1.
Здесь вы можете думать о первых n ролях как о первых n этапах, поэтому первые n строк, таких как" [Min, Max] → Role 0 " в вашем примере. На этапе n я бы вычислил, для всех доступных игроков до максимума P, число различные формации вы можете составить, используя только первые n ролей и до этого количества игроков.
На этапе n+1, для каждого количества доступных игроков, я бы рассмотрел все законные числа игроков в роли n+1. Вычитая это из числа игроков, которых я в данный момент рассматривал, я получаю число игроков, оставшихся для первых n ролей, и я ищу ответ, хранящийся там, чтобы получить количество различных образований для первых n ролей. Суммируя эти возможности, я получаю количество образований, которые я могу составить для первых N + 1 ролей, используя это количество игроков в общей сложности. Ясно, что я повторяю это для всех чисел до P, чтобы получить ответы, которые мне нужно сохранить для этапа n+1-если только это не финальный этап, в котором нужен только ответ для игроков P.
Если решения, которые вы принимаете, можно расположить слева направо по этапам, где ответ для каждого этапа не зависит от большого количества информации и может быть вычислен из ответа для предыдущих этапов, то динамический Программирование обычно является практическим способом решения проблемы. Вы можете превратить практически любую задачу в задачу динамического программирования, если вы готовы хранить и вычислять для очень большого числа возможностей на каждом этапе, но в конечном итоге это число становится настолько большим, что так называемое решение становится совершенно непрактичным.
В качестве примера, в задаче наверху второй этап-это следующая задача только с двумя ролями, A и B.
[3 , 7] → Роль A
[1 , 5] → Роль B
В исходной задаче вам нужно вычислить общее число различных командных образований, если P=8, то есть если у вас есть 8 игроков в команде. Задача второго этапа состоит в том, чтобы определить количество образований, если есть только две роли, но вам нужно определить количество образований для 0 игроков, для 1 игрока, для 2 игроков... до 8 игроков. Затем, когда вы приступите к разработке ответа для третьего этапа, вы можете сказать, например: "если я поставлю 3 игрока в роль C, у меня будет 5 игроки слева и две роли слева, и я могу посмотреть на ответ, который я уже рассчитал для двухролевой задачи с 5 игроками, чтобы увидеть, сколько образований есть с 3 игроками в роли С. "