Объедините ценности, чтобы создать букет из 100

Предположим, у меня есть один массив, имеющий значения:

array(20,40,30,15,60,50,10)

Теперь я хочу создать группу из 100 или около ста. И создать отдельный раунд для каждого набора из 100(или около 100).

Сказать

Case 1:
Round 1: array(60,30,10) // 100 or near to 100
Round 2: array(40,50)    // 100 or near to 100
Round 3: array(15,20)    // 100 or near to 100 or remaining

Case 2:
Round 1: array(60,40)    // 100 or near to 100
Round 2: array(50,20,30) // 100 or near to 100
Round 3: array(15,10)    // 100 or near to 100 or remaining

Так как же мне этого добиться?

Есть ли какой-нибудь алгоритм относительно этого, который я могу изучить?

1 ответ

Вы описываете проблему бинпэкинга, которая является NP-Complete, поэтому нет никакого известного полиномиального решения для ее решения.

Вы можете попробовать экспоненциальный подход (проверить все возможности), если вам нужно точное. Если вы хотите "достаточно близко", вы можете найти в литературе какой-нибудь алгоритм приближения или использовать какое-то эвристическое решение для поиска из поля ИИ, такое как Genetic Algorithm или Hill Climbing.

Другие вопросы по тегам