|
|
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Разбирая прошлогоднюю олимпиаду по программированию, я наткнулся на довольно интересную задачку: В строке записано N натуральных чисел. Сколько существуют способов расставить между ними знаки "+" и "-", чтобы получить число S. Всё бы ничего, но одно НО: время выполнения не более 2 сек.!! Если бы этого ограничения не было, я бы смог тупым подбором подобрать все необходимые варианты. Так вот, не могли бы вы помочь начинающему программисту с логикой данной программы, я не прошу исходников, просто прошу помочь немного с алгоритмом. Заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2011, 23:29 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
Так это ж по определению полный перебор. Видимая оптимизация - это пляски с хранением промежуточных результатов, вместо пересчёта выражения корректировать результат предыдущего. Вторая видимая оптимизация - использования алгоритма построения корректировок, которая перебирает все варианты так, что каждый следующий отличается от предыдущего только на один элемент. Что-то ещё придумать навскидку не удаётся... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 09:19 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
BeatCoder, приведи ссылку на задачу, или укажи область значений N ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 11:00 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, N(3<=N<=15), а S(|S|<10 8 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 14:26 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
BeatCoderAleksandr Sharahov, N(3<=N<=15), а S(|S|<10 8 ) Всего 2^15=32768 вариантов расстановки знаков. Просто цикл по i и xor с i-1, перекидывание знака у слагаемых. При этом корректируем текущую сумму. 2 сек более, чем достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 14:51 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
BeatCoderAleksandr Sharahov, N(3<=N<=15), а S(|S|<10 8 ) по-моему при таком раскладе обычный перебор уложится даже на самых давних системах (с частотой проца в 800-1000 MHz)... Вообщем так... надо выполнить 2 N-1 проверок. Для одной проверки нам надо сложить(вычесть) N-1 чисел. Одна операция сложения/вычисления берёт 7 тактов (14 проверок = 98 тактов). как написано в литературе один переход цикла - 16 тактов. Ну и сравнение - сколько-то там... ну например 10 тактов тогда 98+16+10 = 124такта на один вариант... таких вариантов 2 14 =16384 ... итого в чистом виде нам потребуется около 2 миллиона тактов. ну пускай нам проц выделить 1% времени... + пускай половину тактов сожрёт компилятор на сервисные комманды и т.д. (то есть имеем 0.5% проц. времени).... получаем 800/200 = 4 миллиона тактов/сек. для нашей программы. То есть при самом худшем раскладе мы впишемся в 0.5 секунды (грубо, возможно неточно... но факт: времени для перебора придостаточно) P.S. Если я неправ поправте пожалуйста ))) пробовал освоить данную тему как-то раньше... и вот не знаю правильно ли я считаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 15:10 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
BeatCoderN(3<=N<=15), а S(|S|<10 8 ) Запустил поиск на Е2160 1.8 Ггц при N=15. Время полного перебора вариантов - 0.045-0.063 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 15:26 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
PS. Среда - VBA MS Access 2003. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 15:27 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
BeatCoder, практически любой современный процессор позволяет менее чем за 0.5 сек перебрать все суммы 25 слагаемых: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2011, 16:28 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
Мне эта задача напоминает "Укладку Рюкзака" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 01:15 |
|
||
|
Расстановка знаков
|
|||
|---|---|---|---|
|
#18+
Так это и есть вариация на тему задачи об одномерном рюкзаке... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2011, 08:45 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37572965&tid=1342563]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
211ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 575ms |

| 0 / 0 |
