| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Интересные и занимательные задачи по программированию > Автобусные билетики |
| Автор: Фолко 14.2.2009, 13:38 |
| Добрый день! Расскажу сначала о постановке задачи, мне она показалась интересной, может вам она тоже понравится и кто-нибудь подскажет какую идею, как реализовать подходящий алгоритм. Задача: Есть автобусный билетик из 6 цифр (например 123123), требуется расставить знаки +-*/() между цифрами билетика и получить число 100. Менять порядок цифр нельзя, но можно составлять числа из цифр билетика (например 12 + 312 + 3). Более подробно задачка описана здесь - http://habrahabr.ru/blogs/i_am_clever/40036/. Пример:0 7 9 6 6 4: (7*6)+(9*6)+4= 42 +54 + 4 = 100 1 4 8 4 3 9: 148-4*(3+9) = 100 Хочу сделать чтобы програмка показывала все варианты билетика. Заранее спасибо! |
| Автор: Akina 14.2.2009, 22:10 |
| Существует конечное число расстановок указанных знаков и, соответственно, выстраиваемых выражений. Так что задача фактически сводится к перебору всех возможных вариантов. |
| Автор: maxdiver 15.2.2009, 20:48 |
| Посчитаем для каждого подотрезка a[l..r] множество всех чисел, которые могут быть получены из него, обозначим его d[l][r]. Тогда ответом будет d[1][n]. Научимся считать это множество. Пусть мы хотим найти значение d[l][r]. Если l=r, тогда вариантов у нас два - это a[l] и -a[l]. Если же l<r, то то, если мы рассмотрим любое выражение, построенное на этом отрезке a[l..r], то в нём найдётся операция, выполняемая последней. Переберём позицию m=l+1..r-1 этой операции и саму операцию (+-*/) , тогда в множество d[l][r] надо добавить все элементы вида d[l][m-1] <операция> d[m+1][r]. Оставшийся случай - когда мы из всех цифр a[l..r] делаем одно число, т.е. в d[l][r] надо добавить ещё a[l..r]. Это решение мне кажется более изящным и надёжным, чем полный перебор. P.S. Почти такая задача попадалась на каком-то контесте недавно. Московская олимпиада что ли... Или четвертьфинал чей-то... |
| Автор: DmitryMainichev 7.5.2010, 07:06 |
| А теперь ответьте, чем полный перебор (решение 1) отличается от вашего варианта (решение 2)? Очевидно же, что результат будет один и тот же, просто алгоритм перебора в решении 2 указан явно, а в решении 1 просто указано направление. |
| Автор: primepornre1 28.9.2020, 19:14 |
Модератор: Сообщение скрыто. |