Рішення
Розчин має дві частини. Спочатку ми виявляємо мінімальний набір, потім доводимо, що він може представляти набір потужності. Рішення налаштовано на реалізацію програмування.
Алгоритм мінімального набору
Знайдіть максимальний елемент із сукупності (множин). P , потенційний мінімальний (багаторазовий) набір спочатку порожній.amP
Якщо є тільки одна група, представляє усіма можливими способами , як пари сум , які складаються в вигляді т , S я J = { ( я , J ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}
Перевірте, чи включені всі елементи з набору сум.
Знайти максимальний елемент з усіх S я J ( що означає разом) з наступним властивістю: для кожного S я J , s або в S я J , або ми можемо знайти в р з безлічі сум , так що р + a s є в S i j .asSijSijasSijаpаp+ асSi j
Якщо це так , що не містить S , просто сума и + р , видалити р + S з S я J (або просто встановити мітку , щоб ігнорувати його) і вставити в р і а , ів в S я J замість.Si jасас+ аpаp+ асSi jаpасSi j
Якщо елемент присутній в кожному видалити його з усіх S я J один раз (або просто встановити мітку , щоб ігнорувати його і не чіпати його більше) і додати його в список елементів потенційного мінімального безлічі P .Si jSi jП
Повторюйте, поки всі не порожніSi j
Якщо частина залишається порожньою, і ми не можемо продовжити, спробуйте ще раз з максимальним значенням для всіх S i j .Si jSi j
Відтворити рекурсивні кроки без вилучень і продовжити з алгоритмом булеан покриття над . (Перед цим можна зробити безпечну перевірку того, що P містить усі елементи, які не можуть бути представлені у вигляді суми двох елементів, тому вони обов'язково повинні знаходитись в нижньому наборі. Наприклад, мінімальний елемент повинен бути в P. )ППП
(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 лише один раз з кожної групи.П= { 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 з усіх груп, оскільки це повторюється. (Це не є загальним явищем, але наш випадок навмисно створений, щоб відобразити, що робити, якщо у нас є повторення.) П= { 5 , 5 }
( 3 , 2 ) , ( 2 , 3 ) , ( 5 ) , ( 3 , 2 )
Тепер ми спробуємо з 3 і маємо 5 = 3 + 2. Додайте його до групи.
( 3 , 2 ) , ( 2 , 3 ) , ( 3 , 2 ) , ( 3 , 2 )
Тепер витягніть 3 і 2, оскільки вони повторюються скрізь, і ми добре а групи порожні.П= { 5 , 5 , 3 , 2 }
( ) , ( ) , ( ) , ( )
Тепер нам потрібно відтворити рекурсивні кроки без видалення, це просто означає виконати вищезазначене, не дійсно видаляючи елементи з просто помістивши їх у P та позначивши, щоб більше не змінювати його.Si jП
( ( 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 ) }
Перевірте, що результат дорівнює , де m - кількість елементів у розчині, у прикладі m = 42м- 1мm = 4
Зберіть пропущені числа від до 2 м - 1 у списку проміжних підсумків12м- 1
( 6 , 7 , 11 , 12 )
- Обґрунтуйте їх відсутність таким чином: представляйте кожне число у двійковій формі
( 7 = 0111 2 ) ( 11 = 1011 2 ) ( 12 = 1010 2 )( 6 = 01102)
( 7 = 01112)
( 11 = 10112)
( 12 = 10102)
являє собою суму 3 + 5, оскільки 0110 2 охоплює другий і третій елементи з ( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ) . Сума цих елементів, 8, вказана у первинному списку сум { 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }601102( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ){ 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }, тому все добре.
являє собою суму 2 + 3 + 5, оскільки 0111 2 охоплює перші три елементи з ( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ) . Сума цих елементів, 10, вказана у первинному списку суми, тому все добре.701112( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
- це 2 + 3 + 5, а 10 - у списку.
12 - це 3 + 5, а 8 - у списку.1112
Якщо будь-яке бінарне представлення відповідає сумі, яку неможливо знайти, повідомте про відсутність рішення.
( 2 , 3 , 5 , 5 )
Обговорення
Необхідно було надати алгоритм, який збирається перевірити, чи покривають суми завершення встановленої потужності, що приховано у бінарному розширенні. Наприклад, якщо ми виключимо 8 та 7 із початкового прикладу, перша частина все-таки забезпечить рішення, лише друга частина повідомила б про відсутніх комбінаціях сум.
м н л о г( м )м журнал2( м )мнжурнал( м )
мжурналмм журнал2( м )
м журнал3( м )
Частини алгоритму припускають, що ми можемо знайти пару сум у лінійному часі, і для цього потрібне сортування.
Неправильний старт
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 152 , 3 , 4 , 6Si j
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, що число повинно повторюватися в кожній групі або мати можливість створювати суму, є досить сильною, щоб вивести нас із прямої експоненціальної води, що було б алгоритмом просто випробувати кожну комбінацію та створити потужність встановити над кожним, поки ми не знайдемо відповідність.