![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| RENGIP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
Здравствуйте. Нужна ваша помощь в плане литературы. Сразу подчеркну что я не прашу вашего решения, только укажите где можно посмотреть более полную информацию может где-то решались подобные задачки.
Проблема заключается в том что необходимо: Разработать рекурсивную подпрограмму которая формирует из заданного списка предметов определенной стоимости и веса набор, вес которого не превышает заданного, а стоимость максимальна. (решение должно быть с использованием полного и ограниченного перебора с использованием рекурсии С++) |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Ищи в исследовании операций и комбинаторике.
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
да что тут думать? массив boolean-типа взято/невзято.
Добавлено через 45 секунд P.S. и этот массив рекурсивно заполнить всеми комбинациями 1 и 0 |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Тут пахнет весовой функцией двух переменных - вес и стоимость. Для "оптимального" решения
можно использовать предварительную сортировку/индексирование |
|||
|
||||
| v_nikolaev |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.5.2007 Репутация: нет Всего: нет |
ну, во-первых, к C++ это имеет мало отношения. во-вторых, что значит ограниченная рекурсия? я могу посоветовать такие варианты: сначала полный перебор для решения задачи - это обычная рекурсия (без отсечений, а возможно с отсечениями)... тут никаких проблем не должно возникнуть. "ограниченная рекурсия" - видимо, это термин, которым заменили понятие "динамическое программирование". суть тут такая. нужно найти для задачи свойство оптимальности подзадач. то есть, если из всего отптимально наполненного мешка вытащить одну вещь некоторой стоимости и некоторого веса, то для оставшегося веса мы будем иметь максимальную цену (без учёта вещи, которую достали). это свойство присутствует в задаче, насколько я могу судить. если для веса, который останется после изъятия вещи, мы имеем неоптимальную цену, то тогда и весь мешок был наполнен неоптимально. рекурсия тут работать будет примерно так: сначала вызываем функцию для нужного веса w[n] - она будет представлять из себя перебор всех возможных вариантов сложения веса и цены единичных вещей и решений, полученных для w[n - a], в свою очередь, для w[n - a] будет строиться решение таким же рекурсивным вызовом. тут a - вес некоторой единичной вещи. тоесть w[] - у нас массив оптимального заполнения веса n деньгами. понятно? вещи нужно добавлять в каком-то определённом порядке, например, заданном в массиве изначально. то есть, если i < j, то вещь с номером i нельзя добавлять в мешок, если добавлена уже вещь с номером j, иначе опять получим перебор или неправильное решение. последовательность добавленных предметов роли не играет для оптимального веса, потому можно использовать любой изначальный порядок. почитать конкретно про такое даже не знаю, где. могу посоветовать книгу Кормен, Ривест и Лейзерсон - "Алгоритмы: построение и анализ." Тут разделы про рекурсию и динамическое программирование (в последнем есть задача про заполнение мешка максимальным весом, которая, видимо, похожа на эту). может, Кнут что-нить такое писал. Это сообщение отредактировал(а) v_nikolaev - 31.5.2007, 13:33 |
|||
|
||||
| v_nikolaev |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.5.2007 Репутация: нет Всего: нет |
кое-что не учёл, нужно хранить двойной массив, индексируемый весом и номером последней вещи, которую взяли, чтобы знать, какие вещи можно брать потом.
рекурсия будет работать так - берём вещь с номером j и весом i - запускаем рекурсию для номера j - 1 и веса n - i и тд, пока не доходим до нулевых весов. уже вычисленные оптимальные варианты выписываем в матрицу, и в следующий раз, используем значения из неё, когда произойдёт такой же вызов рекурсивной функции - с параметрами, для которых вычисление уже было.... |
|||
|
||||
| RENGIP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
Вобщем решил разобраться по частям нашкодил следующее, но почему-то не выводится массив отборного веса. Посмотрите в чем дело может что то лучще переделать
[code=cpp] #include <iostream.h> #include <conio.h> #include <windows.h> #include <iomanip.h> char *Rus ( const char *text ); int main () { const int colpredmets = 5; // переменная которая отвечает за кол-во предметов const int scetcik = 6; int hold; // хранит наш ограниченный вес по которому будет осуществляться отбор предметов // определим массивы под наше введенное количество предметов int stoimost [ colpredmets ]; // стоимость предметов int ves [ colpredmets ]; // вес предметов int vesotbor [] = {0}; // отборный вес cout << Это сообщение отредактировал(а) RENGIP - 3.6.2007, 17:58 |
|||
|
||||
| Lomir |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 30.1.2007 Где: Lithuania::Kaunas Репутация: 1 Всего: 1 |
Чего делает вот это строка вопше непойму, помойму - ничего.
А за пределы масива не залазим? Вопше толком непонел что должен делать этот код. |
||||
|
|||||
| RENGIP |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
ves [ j + 1 ]; данным методом я пытаюсь перейти к следующему элементу массива. Насчет int vesotbor [] = {0}; Бл.... не знал как указать неопределенное количество элементов массива, ведь я не знаю сколько в списки отборного веса будет элементов. Поэтому решил таким макаром: после того как будет ясно 0 = значение которое отобрано и это: vesotbor [ j ] = ves [ j ]; относить Это сообщение отредактировал(а) RENGIP - 3.6.2007, 17:32 |
||||||
|
|||||||
| RENGIP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
Что за ерунда не могу понять раньше схема работала а сейчас не хочет. Вобщем вот код
по идеи должно быть следующим образом вводим число, жмем энте получаем наше число. А работает как то странно - жмешь энтер не выводит никакого значения жмешь еще выходит с консоли. Замечу что данная схема работала до сегодняшнего дня а тут не хочет. компилер - Visual C++ 6.0 Это сообщение отредактировал(а) RENGIP - 3.6.2007, 17:26 |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
P.S. вместо #include <iostream.h> пиши #include <iostream> |
|||
|
||||
| RENGIP |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
Такой вариант работает как надо. Но возникает другой вопрос, почему они так отличаются обьясни. |
||||||
|
|||||||
| comp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 15.11.2006 Репутация: нет Всего: 1 |
блин, это задача о рюкзаке, самая обычная задача на динамику, какой нафиг перебор. |
|||
|
||||
| RENGIP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
Читай внимательно вопрос в начале. Эта задача должна быть решена полным или ограниченным перебором. То что ты предлагаешь не подходит. Если у тебя есть варианты решения данным методом то можешь блиснуть а нет не засоряй форум. |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 7 Всего: 18 |
Потому что cout и cin находятся в пространстве имен std. -------------------- Подпись больше не нужна |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |