Решение
Решение состоит из двух частей. Сначала мы обнаруживаем минимальное множество, а затем доказываем, что оно может представлять множество степенной суммы. Решение адаптировано для реализации программ.
Алгоритм минимального набора
Найдите максимальный элемент из набора сумм (мульти). , потенциальный минимальный (мульти) набор изначально пуст. рamP
Если не существует только одной группы, представляйте всеми возможными способами в виде пары сумм, которые складываются в , a m S i j = { ( a i , a j ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}
Убедитесь, что все элементы из набора сумм включены.
Найти максимальный элемент из всех (означающего вместе) со следующим свойством: для каждого , является либо в , или мы можем найти из набор сумм, так что находится в . S i j S i j a s S i j a p a p + a s S i jasSijSijasSijapap+asSij
Если это так, тоSij не содержит S , просто сумма сек + а р , удалить р + S из S я J (или просто установить метку , чтобы игнорировать его) и вставить в р и а S в S я J вместо.asas+apap+asSijapasSij
Если элемент присутствует в каждом удалить его из всех S я J один раз (или просто установить метку , чтобы игнорировать его и не трогать его больше) и добавить его в список элементов потенциального минимального множества P .SijSijP
Повторяйте, пока все не опустеютSij
Если некоторые из остаются непустыми и мы не можем продолжить, попробуйте еще раз с максимальным значением из всех S i j .SijSij
Воссоздать рекурсивные шаги без удалений и продолжить с алгоритмом булеан покрытия над . (Перед этим вы можете выполнить безопасную проверку того, что P включает все элементы, которые не могут быть представлены в виде суммы двух элементов, поэтому они обязательно должны быть в базовом наборе. Например, минимальный элемент должен быть в P. )PPP
(10. Обратите внимание, что решение с минимальным множеством, являющееся целью алгоритма, не может содержать более одного повторения одного и того же числа.)
Пример:
{2,3,5,7,8,10,12,13,15}
Представьте 15 всеми возможными способами как сумму двух чисел из набора сумм.
(13,2),(12,3),(10,5),(8,7)
Попробуйте найти максимальное число, которое есть во всех группах или которое может быть представлено в виде суммы. Очевидно, что мы можем начать поиск с 8, нет смысла идти над ним.
13 из первой группы - 13 = 8 + 5, так что 13 - это хорошо, но 12 из второй группы - не хорошо, поскольку в наборе сумм нет 4, чтобы сделать 12 = 8 + 4. Далее мы попробуем с 7. Но сразу 13 не может быть покрыто, нет 6.
Далее мы попробуем 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, а для последних либо 8 = 5 + 3, либо 7 = 5 + 2, но не оба. Группы сейчас:
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
5 повторяется во всех группах, поэтому мы извлекаем его . Мы извлекаем 5 только один раз из каждой группы.P={5}
(8,2),(7,3),(5,5),(3,7)
Очевидно, что нет смысла идти выше 5, поэтому мы пробуем 5 снова. 8 = 5 + 3, 7 = 5 + 2, так что все в порядке
((5,3),2),((5,2),3),(5,5),(3,(5,2))
Извлеките один 5 снова из всех групп, так как он повторяется. (Это не часто встречается, но наш случай специально создан, чтобы показать, что делать в случае повторения.) P={5,5}
(3,2),(2,3),(5),(3,2)
Теперь мы попробуем с 3 и 5 = 3 + 2. Добавьте это в группу.
(3,2),(2,3),(3,2),(3,2)
Теперь извлеките 3 и 2, поскольку они повторяются повсюду, и мы в порядке а группы пусты.P={5,5,3,2}
(),(),(),()
Теперь нам нужно воссоздать рекурсивные шаги без удалений, это просто означает выполнение вышеописанного без реального удаления элементов из просто поместив их в P и пометив, чтобы они больше не изменялись.SijP
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))
Электропитание покрытия
Цель этой части состоит в том, чтобы проверить, может ли найденный минимальный набор покрыть набор суммы мощности. Вполне возможно, что найденное решение может охватывать все заданные суммы, но они не являются установленными суммами. (Технически, вы могли бы просто создать набор суммы мощности из найденного минимального набора и проверить, находится ли каждая сумма, как предписано набором мощности, в начальном наборе суммы. Это все, что просто слилось с тем, что у нас уже есть, поэтому ничего не теряется Вы можете выполнить эту часть, перематывая рекурсию.)
- Закодируйте все элементы из минимального набора, используя последовательные степени 2. Порядок не важен. Кодируйте один и тот же элемент с новым значением столько раз, сколько он повторяет. Начните с C = 1, каждый следующий элемент имеет C = 2C.
(2=[1],3=[2],5=[4],5=[8])
- Заменить элементы в восстановленном списке рекурсии,
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))
с кодировкой: 2 с 1, 3 с 2, 5 с 4 и еще 5 с 8. Обратите внимание, что каждый элемент имеет различную кодировку, даже если они повторяются.
((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
- Соберите все промежуточные суммы, на данный момент имеем (1,2,4,8)
((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))
(1,2,3,4,5,8,9,10)
((14),1),((13),2),((7),8),(15)
(1,2,3,4,5,8,9,10,13,14,15)
{(15),(15),(15),(15)}
2m−1mm=4
12m−1
(6,7,11,12)
- Обоснуйте их отсутствие следующим образом: представьте каждое число в двоичном виде
(6=01102)
(7=01112)
(11=10112)
(12=10102)
601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}так что все в порядке.
701112(2=[1],3=[2],5=[4],5=[8])
1112
Если какое-либо двоичное представление соответствует сумме, которую невозможно найти, сообщите, что решения не существует.
(2,3,5,5)
обсуждение
Необходимо было предоставить алгоритм, который будет проверять, покрывают ли суммы завершение набора мощности, что скрыто в бинарном расширении. Например, если мы исключим 8 и 7 из исходного примера, первая часть все равно предоставит решение, только вторая часть сообщит о пропущенных комбинациях сумм.
mnlog(m)mlog2(m)mnlog(m)
mlogmmlog2(m)
mlog3(m)
Части алгоритма предполагают, что мы можем найти пару сумм за линейное время, и это требует сортировки.
Неправильный старт
2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sij
5,4,3,3
2,2,3,4,42,3,4,6
Цель этого алгоритма состоит в том, чтобы обеспечить решение, как только мы все правильно запустили.
улучшения
Шаг 4. это тот, который можно обновить таким образом: вместо максимального мы могли бы попробовать каждый элемент в порядке убывания, который удовлетворяет данному условию. Мы создаем отдельную ветку для каждого. Если какая-то ветка не дает решения, отмените его.
2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4по-разному, так как все они проходят первый тест. (Нет причин использовать 2 или 3, так как мы знаем, что они должны быть в базовом наборе.) И просто продолжаем в том же духе, пока не соберем все версии, которые могут дойти до конца. Это создаст решение с полным покрытием, которое обнаружит более одного базового набора.
Другое дело, поскольку мы знаем, что у нас не может быть более одного повторения, если случай минимален, мы можем включить это в наш алгоритм.
В целом, условие на шаге 4. что число должно повторяться в каждой группе или иметь возможность создавать сумму, достаточно сильно, чтобы вытащить нас из прямых экспоненциальных вод, что было бы алгоритмом простого опробования каждой комбинации и создания силы установить над каждым, пока мы не найдем совпадение.