Я бы решил это как проблему динамического программирования . Позвольте мне пройти его в течение 20. Сначала возьмем простые числа в обратном порядке.
19, 17, 13, 11, 7, 5, 3, 2
Теперь мы рассмотрим лучшие решения, которые использовали подмножества этих простых чисел растущего размера. Вначале мы собираемся выполнить поиск по ширине, но с хитростью в том, что мы всегда используем наибольшее неиспользуемое в настоящее время простое число (плюс, возможно, больше). Я буду представлять все структуры данных в форме size: {set} = (total, next_number)
. (Я делаю это вручную, поэтому все ошибки мои.) Вот как мы строим структуру данных. (На каждом шаге я рассматриваю все способы выращивания всех наборов одного меньшего размера из предыдущего шага и получаю лучшие итоги.)
Попробуйте воспроизвести этот листинг и, по модулю любых ошибок, которые я сделал, у вас должен быть алгоритм.
Step 0
0: {} => (1, 1)
Step 1
1: {19} => (20, 19)
Step 2
2: {19, 17} => (37, 17)
Step 3
3: {19, 17, 13} => (50, 13)
Step 4
4: {19, 17, 13, 11} => (61, 11)
Step 5
5: {19, 17, 13, 11, 7} => (68, 7)
6: {19, 17, 13, 11, 7, 2} => (75, 14)
Step 6
6: {19, 17, 13, 11, 7, 5} => (73, 5)
{19, 17, 13, 11, 7, 2} => (75, 14)
7: {19, 17, 13, 11, 7, 5, 2} => (88, 20)
{19, 17, 13, 11, 7, 5, 3} => (83, 15)
Step 7
7: {19, 17, 13, 11, 7, 5, 2} => (88, 20)
{19, 17, 13, 11, 7, 5, 3} => (83, 15)
8: {19, 17, 13, 11, 7, 5, 3, 2} => (91, 18)
Step 8
8: {19, 17, 13, 11, 7, 5, 3, 2} => (99, 16)
А теперь мы просто отслеживаем структуры данных в обратном направлении, чтобы прочитать 16, 15, 7, 11, 13, 17, 19, 1
, который мы можем отсортировать, чтобы получить 1, 7, 11, 13, 15, 16, 17, 19
.
(Обратите внимание, что есть лот деталей, чтобы получить право превратить это в решение. Удачи!)