Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 7

Комбинаторные алгоритмы. Backtracking. Пробирки

08.04.2014, 23:15. Показов 4005. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется три пробирки по 100 мл, первые две пробирки с рисками (метками). Риски совпадают. Изначально, первая пробирка имеет 100 мл, другие пусты. Требуется написать программу, которая выясняет, можно ли отделить в третьей пробирке один миллилитр. Количество и сами риски задаются пользователем.

Как сказано в заголовке, здесь надо использовать комбинаторные алгоритмы. Думаю, можно как-то через backtracking решить.
Я не рассчитываю на код. Объясните пожалуйста, хотя бы на псевдокоде или хотя бы на пальцах алгоритм решения задачи.

У самого есть несколько вариантов, но не знаю, как связать это, и возможно ли сделать как-то рекурсивно.
Первое, что можно рассмотреть: граф, изображающий возможные состояния набора из трех пробирок и возможные переходы между ними. Но тут другой вопрос встает: как его правильно построить?

Второй вариант: льем во вторую пробирку до первой риски (или выливаем из первой до риски, не важно, думаю), сверяем, будет ли разница в один мл. Если нет, выливаем из второй в третью. Потом льем опять из первой во вторую. И так до конца повторяем, пока либо не найдем ответ, либо не закончится жидкость. А вот что потом...
Что-то мне это напомнило ханойские башни...

Может, у кого есть/были наработки или кто сможет подсказать алгоритм, помогите разобраться!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2014, 23:15
Ответы с готовыми решениями:

Комбинаторные алгоритмы
Не знаю считается ли такая задача разделом комбинаторкик, но вроде слово комбинация больше всго подходит. В общем есть N переменных,...

Комбинаторные алгоритмы
Здравствуйте! У меня задание сделать конспект по комбинаторным алгоритмам. Подскажите, пожалуйста, учебник или какую-нибудь литературу,...

Комбинаторные алгоритмы
Подскажите пожалуйста книги по дисциплине комбинаторные алгоритмы. Желательно, где рассказывается с самых основ. Заранее спасибо!

25
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 7
09.04.2014, 22:15  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Metall_Version Посмотреть сообщение
можно делить емкость пополам . и отнимать и добавлять известное количество жидкости. тут реально комбинаторика . нужно просто такими способами дойти до любого объема этой последовательности (2.4.8.16.32.64)
Как делить пополам? На глаз? Пользователь, к примеру, задал значения рисок: 3 20 41 70 в первой пробирке и 5 15 61 80 во второй. Как пополам-то делить?
Цитата Сообщение от Евгений В Посмотреть сообщение
Мне только не понятно, как тут привязать уровень к расчетам. Тогда нужно вводить высоту.
Т.е. не очень понятна эта часть:
Цитата Сообщение от ctreloknik
риски задаются пользователем
Что непонятно? Пользователь сам задал, какие метки есть. Хотя бы одна, но должна быть. Собственно, выше написано, как может быть размечено.

Добавлено через 2 минуты
Цитата Сообщение от Евгений В Посмотреть сообщение
ctreloknik,
Посмотрите здесь http://atpp.vstu.edu.ru/cgi-bi... id_prb=204
Спасибо, перед созданием темы, я прошерстил инет и видел этот материал. В том то и беда, что не знаю, как правильно сделать этот граф.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
09.04.2014, 22:18
я думаю число можно еще больше уменьшить. но оно все равно не будет ровно 1

Добавлено через 2 минуты
Цитата Сообщение от ctreloknik Посмотреть сообщение
Как делить пополам? На глаз? Пользователь, к примеру, задал значения рисок: 3 20 41 70 в первой пробирке и 5 15 61 80 во второй. Как пополам-то делить?
а как решать задачу не зная условия ? .. вы точнее скажите на каких отметках есть риски ... Или же риски мы сами ставим . А то - решите мне то не знаю что
а делить можно и без рисок я постами выше это очень подробно описал .
0
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 7
09.04.2014, 22:21  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
я думаю число можно еще больше уменьшить. но оно все равно не будет ровно 1
Вот, почти такое же условие: http://atpp.vstu.edu.ru/cgi-bi... id_prb=204
Разве что я могу задать (как оказалось уже сегодня), разные метки на двух пробирках. Да не суть важно это.
Вот представьте, что вам заказчик дал такое ТЗ (в моем случае, это препод). Вы же не будете к нему приходить с пробирками и на глазах у него это переливать?

Добавлено через 1 минуту
Цитата Сообщение от Metall_Version Посмотреть сообщение
Или же риски мы сами ставим . А то - решите мне то не знаю что
а делить можно и без рисок я постами выше это очень подробно описал .
Сказал же, пользователь сам задает отметки (они же риски). Перечитайте еще раз вот это: "Пользователь, к примеру, задал значения рисок: 3 20 41 70 в первой пробирке и 5 15 61 80 во второй." (В милилитрах, конечно же)
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
09.04.2014, 22:25
Цитата Сообщение от ctreloknik Посмотреть сообщение
Вот представьте, что вам заказчик дал такое ТЗ (в моем случае, это препод).
зачем браться за задания в которых не компетентен. в данном случае это математика.

я без понятия честно говоря как решить такую задачу .когда входные данные не известны даже.

Добавлено через 1 минуту
Цитата Сообщение от ctreloknik Посмотреть сообщение
Сказал же, пользователь сам задает отметки (они же риски). Перечитайте еще раз вот это: "Пользователь, к примеру, задал значения рисок: 3 20 41 70 в первой пробирке и 5 15 61 80 во второй." (В милилитрах, конечно же)
я думал пользователь это я или тот кто решает задачу. то есть я могу на свое усмотрение задавать риски . теперь понятно все удачи вам в этой задачке
0
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 7
09.04.2014, 22:30  [ТС]
Цитата Сообщение от Metall_Version Посмотреть сообщение
зачем браться за задания в которых не компетентен. в данном случае это математика.
я без понятия честно говоря как решить такую задачу .когда входные данные не известны даже.
если бы я сам брал задачу - одно дело, другое, когда тебе ее самому дают, ибо это лаба. никакая это не математика.
какие еще данные на вход? не знаю, в какой раз говорю, но пользователь сам вводит, какие метки есть у пробирок. все! дальше тыкает кнопочку и программа считает, есть ли там решение.
пример данных входа:
Риски 1 пробирки: 3 20 41 70
Риски 2 пробирки: 5 15 61 80
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
10.04.2014, 11:31
Цитата Сообщение от ctreloknik Посмотреть сообщение
Риски 1 пробирки: 3 20 41 70
Риски 2 пробирки: 5 15 61 80
1) допустим, у нас есть бесконечный резервуар и у нас есть риска на 100 мл.
рассмотрим действия которые мы можем сделать.
- набрать первую до риски и отлить до меньшей риски во второй
входные данные - 3, 20, 41, 70, отнимаем 5, 15, 61, 80(если можем)
отливаем от полной : 95, 85, 39, (20 исключаем, есть такая отметка)
от 70 : 65, 55, 9
от 41: 36, 29
от 20: 15, 5 - исключаем так как есть такие отметки
- набрать вторую до риски и долить до края от первой, тогда входные данные будут такие:
входные данные - 3, 20, 41, 70, отнимаем 95, 85, 39, 20(если можем)
от 100: получим значения рисок второй пробирки - не надо
от 70: 31 и 50
от 41 : 2 и 20(не сохраняем)

вот и вырисовался алгоритм.
1) создаем какой-то класс для сохранения действий(Action например)
2) создаем словарь: Dictinary<int, Action> чтоб хранить все возможные значения, которые можем получить
3) заполняем словарь входными данными - значения рисок пробирок
4) выполняем определенное действие над каждым значением в словаре - в результате получаем новое значение для словаря: новый ключ(к-во мл) и новый путь для этого. если в словаре есть ключ с меньшим количеством действий - то не сохраняем, если с большим - то заменяем.
5) циклически выполняем действия пока не получим искомое значение - путь(порядок действий) к нему уже сохранен

Добавлено через 2 минуты
P.S. не претендую на эффективность алгоритма, наверняка можно найти более эффективное решение. например, построение графа и поиск пути по нему.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2014, 11:31
Помогаю со студенческими работами здесь

Комбинаторные алгоритмы. Вывести на экран все возможные варианты действий художника
Помогите пожалуйста написать программу. Условие: Художнику предложили учавствовать в выставке. Право отобрать картины и их количество...

Комбинаторные алгоритмы: Выяснить, можно ли разделить элементы данного массива на два подмассива с одинаковой суммой элементов
Здравствуйте, помогите пожалуйста реализовать решение следующей задачи: &lt;&lt;&lt; Дан одномерный массив натуральных чисел....

Задача пробирки
В третьей пробирки налито 100мл жидкости. Используя риски первой и второй пробирки требуется получить заданное число мл в третьей пробирки....

Backtracking
Уважаемые, форумчане! Может кто-нибудь хорошо знаком с методом backtracking. Объясните, пожалуйста, в чем суть, а то везде написано про это...

Разница между DFS и Backtracking
Не могу никак понять в чём принципиальная разница между Поиском в глубину (DFS) и Поиском с возвратом (Backtracking). Предполагаю, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru