Ось підказка для початку роботи. Застосуйте стандартні алгоритми динамічного програмування для перерахування набору розділів цілого числа та додайте певну логіку, щоб перевірити, який із них дозволяє здійснити унікальні зміни шляхом ітеративної перевірки всіх сум, внесення змін та перевірки унікальності.
У трохи більш докладно: Припустимо , у вас є мультімножество . З огляду на число з , як ви могли ідентифікувати підмультисета який підсумовує ? Як ви могли перевірити, чи унікальний цей підмультисет? Спробуйте адаптувати стандартні методи динамічного програмування для внесення змін . (Див. Також це питання .)Si1≤i≤nSi
З огляду на мультисети , як ви могли перевірити, чи відповідає він другій умові, тобто чи кожне число від 1 до може бути однозначно виражене сумою підмультисета (унікальна умова внесення змін)? Це повинно бути досить легко, якщо ви вирішили попередній.SnS
нехай позначає перелік мультисетів, які відповідають обом вашим умовам. Якщо ви знали , як би ви могли використовувати цю інформацію для побудови ? Тут ви можете скоригувати стандартні методи динамічного програмування для перерахування розділів цілого числа.P(n)P(1),P(2),…,P(n)P(n+1)
Ось підхід, який, мабуть, буде кращим.
Припустимо, - мультисет, який задовольняє обидві ваші умови (для ). Як ми можемо розширити його, щоб отримати багатосезонний який має ще один елемент? Іншими словами, як ми можемо визначити всі способи додати ще один елемент до , щоб отримати новий багатосезонний який задовольняє обидві ваші умови (для деяких )?SnTSTn′
Відповідь: якщо можна виразити у вигляді суми деяких елементів , то немає сенсу в додаванні його в : що може викликати порушити умова єдиності. Отже, ми можемо перерахувати всі цілі числа які не можуть бути виражені сумою деяких елементів ; кожне з них - це те, що потенційно може бути додано до щоб отримати новий багатосезонний який задовольнятиме обом умовам (для деяких інших ).xSSTxSSTn
Крім того, можна перерахувати, які цілі числа можуть бути виражені сумою деяких елементів , а які не можуть, використовуючи динамічне програмування. Ви будуєте двовимірний масив булевих, де є істинним, якщо є спосіб виразити ціле число як суму деякої частини Перші елементи ( можуть бути використані лише перші елементи ; де відсортовано, тому та ). Зауважимо, щоSA[1…|S|,1…n]A[i,j]jiSiSSS={s1,s2,…,sk}s1≤s2≤⋯≤skA[i,j]можна обчислити, використовуючи значення : зокрема, якщо , або іншому випадку. Це дозволяє визначити всі числа , які є кандидатами для додавання в .A[1…i−1,1…j−1]A[i,j]=A[i−1,j]∨A[i−1,j−si]j>siA[i,j]=A[i−1,j]S
Далі, для кожного розширення кандидата з (отриманого додаванням одного елемента до ), ми хочемо перевірити, чи задовольняє обом умовам. Нехай позначає суму елементів і сума елементів . Нам необхідно перевірити , чи відповідає чи кожне ціле число в інтервалі можна виразити у вигляді суми деяких з елементів . Це теж можна вирішити за допомогою динамічного програмування, використовуючи стандартні алгоритми для внесення змін. (Насправді, якщо у вас ще є масивTSSTnSn′Tn+1,n+2,…,n′TAЗгадане вище, ви можете легко розширити його трохи, щоб вирішити цю проблему: ми робимо це масив , продовжуємо заповнювати всі додаткові записи та переконайтесь, що - все вірно.) Отже, тепер ми можемо перерахувати всі багатонаціональні які розширюються одним елементом, який задовольняє обом умовам.A[1…|T|,1…n′]A[|T|,n+1],A[|T|,n+2],…,A[|T|,n′]TS
Це негайно пропонує алгоритм перерахувати всі мультисети які задовольняють вашій умові, для всіх до деякої межі, скажімо, . У нас буде масив , де зберігає всі мультисети які дорівнюють 5, і, як правило, зберігає набір усіх мультизадач що дорівнює .Snn≤20P[1…20]P[5]SP[n]Sn
Далі ми можемо ітераційно заповнити . Почніть з налаштування щоб містити лише один мультисет . Далі для кожного (рахуючи від 1 до 20), для кожного перераховуйте всі можливі розширення of (використовуючи вищевикладені методики), нехай позначає суму елементів , і вставте в якщо його вже немає і якщо .P[n]P[1]{1}nS∈P[n]TSn′TTP[n′]n′≤20
Це має бути досить виконано. Удачі! Веселіться! Опрацювання деталей буде хорошим навчанням в динамічному програмуванні.