Извините, если это плохой вопрос, я не знаю, как это сформулировать, и из-за этого я не смог задать правильные вопросы, чтобы найти решение, поэтому любая помощь приветствуется.
Я делаю основную c мобильную игру, я хочу показать игроку максимальную сумму вознаграждения, которая может быть получена из его текущего уровня запасов.
Рассмотрим следующий сценарий:
Существует список сборок, которые могут быть завершены и предлагают вознаграждение. Каждая из этих сборок требует, чтобы для ее завершения был составлен список Компонентов, только для одной, но разных сборок требуются разные Компоненты. Имеется перечень запасов этих компонентов в различных количествах.
Возьмем, к примеру, следующую таблицу: ТАБЛИЦА СБОРК И ТРЕБОВАНИЯ К КОМПОНЕНТАМ
(Если изображение не не загружайте, это просто таблица со строкой заголовка букв AI, а первый столбец - это идентификационные номера 1-17. Число квадратов в таблице заполнено, чтобы указать, какие компоненты (идентификационные номера) требуются для каждой сборки. (заголовок строки букв))
Если в первой строке указаны сборки, а в первом столбце - идентификаторы компонентов, заполненные черные пробелы указывают, какие компоненты требуются для этой сборки.
С любым запасом Уровни, которые игрок имеет, я хочу показать им, какую комбинацию сборок и сколько раз каждый из них должен быть пройден, чтобы получить максимальную сумму вознаграждения. Например, вы можете выполнить сборку А два раза, чтобы получить общее вознаграждение 400, но вы можете выполнить сборку Б три раза и сборку C один раз, чтобы получить общее вознаграждение 500 человек.
Вот где я застреваю ...
Возможно завершить сборку более одного раза, исключив общие методы перестановки и комбинирования.
Я создал метод для проверки, если список Сборки могут быть выполнены с текущим запасом, например, если вы спросили меня, может ли игрок выполнить сборку D, E и F три раза каждая (или сборку D дважды, сборку F один раз и сборку E три раза, например), этот метод вернет true или false.
Моя первоначальная мысль состоит в том, чтобы создать список всех возможных комбинаций сборок, которые могут быть завершены с текущим уровнем запаса, а затем проверить сумму вознаграждения, которую получит каждая, а затем вернуть комбинацию с наибольшим значением. Я не уверен, что это правильный путь к go об этом.
Моя главная проблема в том, что я не знаю, как собрать список всех возможных комбинаций на основе доступных запасов, и я не знаю Не знаю, с чего начать. Я смотрел на алгоритмы перестановки и комбинирования, возможно, я что-то упускаю из-за комбинированных алгоритмов, но я не думаю, что это то, что я ищу.
- Я думал об использовании для l oop в списке всех сборок, проверьте максимальное количество раз, которое каждая из них может быть завершена с текущим запасом, и сделайте что-нибудь из этого списка, но при этом будет получен только список максимальных времен каждой отдельной сборки. может быть завершено.
- Я думал о том, чтобы взять список из приведенного выше l oop и проверить, есть ли другие комбинации, которые можно добавить к ним, но тогда я не уверен, как получить все это утверждение для l oop закончено для каждого объекта в списке
Я могу быть совершенно не в своем уме, это может быть плохой практикой, я не скажу слишком много, если меня об этом не попросят, потому что я чувствую, что я упускаю что-то очень простое и важное, что решило бы все мои проблемы, и один из вас, гений, "покажет, как глупо я" я был.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Теперь я понял, что моя проблема в том, что для каждого из них неопределенный размер возможная комбинация, вы можете завершить A один раз или B и C один раз и c. Я могу представить, как этот код l oop может выглядеть в коде:
for (int i = 0; i < assemblies.size; i++){
Assembly a1 = assmelbies.get(i);
int x = 0;
while (CanCompleteXTimes(a1, x + 1))
x++;
//save the fact a1 can be completed up to x times with whats in stock
//adjust the copy of the stock data to reflect whats considered to have
//been used
}
но тогда я не уверен, как я могу oop это бесконечно, пока не пройдут все комбинации.