Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полный и ограниченный перебор с рекурсией 
:(
    Опции темы
RENGIP
Дата 30.5.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Здравствуйте. Нужна ваша помощь в плане литературы. Сразу подчеркну что я не прашу вашего решения, только укажите где можно посмотреть более полную информацию может где-то решались подобные задачки. 

Проблема заключается в том что необходимо:

Разработать рекурсивную подпрограмму которая формирует из заданного списка предметов определенной стоимости и веса набор, вес которого не превышает заданного, а стоимость максимальна. 

(решение должно быть с использованием полного и ограниченного перебора с использованием рекурсии С++)

PM   Вверх
threef
Дата 30.5.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Ищи в исследовании операций и комбинаторике. 
PM MAIL   Вверх
nerezus
  Дата 30.5.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



да что тут думать? массив boolean-типа взято/невзято.

Добавлено через 45 секунд
P.S. и этот массив рекурсивно заполнить всеми комбинациями 1 и 0


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
threef
Дата 30.5.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Тут пахнет весовой функцией двух переменных - вес и стоимость. Для "оптимального" решения 
можно использовать предварительную сортировку/индексирование
PM MAIL   Вверх
v_nikolaev
Дата 31.5.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Цитата(RENGIP @ 30.5.2007,  19:11)
Здравствуйте. Нужна ваша помощь в плане литературы. Сразу подчеркну что я не прашу вашего решения, только укажите где можно посмотреть более полную информацию может где-то решались подобные задачки. 

Проблема заключается в том что необходимо:

Разработать рекурсивную подпрограмму которая формирует из заданного списка предметов определенной стоимости и веса набор, вес которого не превышает заданного, а стоимость максимальна. 

(решение должно быть с использованием полного и ограниченного перебора с использованием рекурсии С++)

ну, во-первых, к C++ это имеет мало отношения.

во-вторых, что значит ограниченная рекурсия?

я могу посоветовать такие варианты: сначала полный перебор для решения задачи - это обычная рекурсия (без отсечений, а возможно с отсечениями)... тут никаких проблем не должно возникнуть.

"ограниченная рекурсия" - видимо, это термин, которым заменили понятие "динамическое программирование". суть тут такая. нужно найти для задачи свойство оптимальности подзадач.

то есть, если из всего отптимально наполненного мешка вытащить одну вещь некоторой стоимости и некоторого веса, то для оставшегося веса мы будем иметь максимальную цену (без учёта вещи, которую достали). это свойство присутствует в задаче, насколько я могу судить.

если для веса, который останется после изъятия вещи, мы имеем неоптимальную цену, то тогда и весь мешок был наполнен неоптимально.

рекурсия тут работать будет примерно так: 

сначала вызываем функцию для нужного веса w[n] - она будет представлять из себя перебор всех возможных вариантов сложения веса и цены единичных вещей и решений, полученных для w[n - a], в свою очередь, для w[n - a] будет строиться решение таким же рекурсивным вызовом. тут a - вес некоторой единичной вещи. тоесть w[] - у нас массив оптимального заполнения веса n деньгами. понятно? smile
вещи нужно добавлять в каком-то определённом порядке, например, заданном в массиве изначально. то есть, если i < j, то вещь с номером i нельзя добавлять в мешок, если добавлена уже вещь с номером j, иначе опять получим перебор или неправильное решение. последовательность добавленных предметов роли не играет для оптимального веса, потому можно использовать любой изначальный порядок.

почитать конкретно про такое даже не знаю, где.

могу посоветовать книгу Кормен, Ривест и Лейзерсон - "Алгоритмы: построение и анализ." Тут разделы про рекурсию и динамическое программирование (в последнем есть задача про заполнение мешка максимальным весом, которая, видимо, похожа на эту).
может, Кнут что-нить такое писал.

Это сообщение отредактировал(а) v_nikolaev - 31.5.2007, 13:33
PM MAIL   Вверх
v_nikolaev
Дата 31.5.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



кое-что не учёл, нужно хранить двойной массив, индексируемый весом и номером последней вещи, которую взяли, чтобы знать, какие вещи можно брать потом.

рекурсия будет работать так - берём вещь с номером j и весом i - запускаем рекурсию для номера j - 1 и  веса n - i и тд, пока не доходим до нулевых весов. уже вычисленные оптимальные варианты выписываем в матрицу, и в следующий раз, используем значения из неё, когда произойдёт такой же вызов рекурсивной функции - с параметрами, для которых вычисление уже было....
PM MAIL   Вверх
RENGIP
Дата 3.6.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
Lomir
Дата 3.6.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 30.1.2007
Где: Lithuania::Kaunas

Репутация: 1
Всего: 1



Код
ves [ j + 1 ];

Чего делает вот это строка вопше непойму, помойму - ничего.
Код

   int vesotbor [] = {0};        // отборный вес
   vesotbor [ j ] = ves [ j ];

А за пределы масива не залазим?

Вопше толком непонел что должен делать этот код.
PM MAIL ICQ Skype   Вверх
RENGIP
Дата 3.6.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Цитата(Lomir @ 3.6.2007,  12:54)
Код
ves [ j + 1 ];

Чего делает вот это строка вопше непойму, помойму - ничего.
Код

   int vesotbor [] = {0};        // отборный вес
   vesotbor [ j ] = ves [ j ];

А за пределы масива не залазим?

Вопше толком непонел что должен делать этот код.

ves [ j + 1 ]; данным методом я пытаюсь перейти к следующему элементу массива.

Насчет int vesotbor [] = {0};  Бл.... не знал как указать неопределенное количество элементов массива, ведь я не знаю сколько в списки отборного веса будет элементов. Поэтому решил таким макаром: после того как будет ясно 0 = значение которое отобрано

и это: vesotbor [ j ] = ves [ j ]; относить

Это сообщение отредактировал(а) RENGIP - 3.6.2007, 17:32
PM   Вверх
RENGIP
Дата 3.6.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Что за ерунда не могу понять раньше схема работала а сейчас не хочет. Вобщем вот код
Код

#include <iostream.h>
#include <conio.h>

int main ()
{
    int n;

    cout << "Vvod: ";
    cin >> n;

    cout << "vivod: " << n;

    
    getch ();
    return 0;

}


по идеи должно быть следующим образом вводим число, жмем энте получаем наше число. 
А работает как то странно - жмешь энтер не выводит никакого значения жмешь еще выходит с консоли. Замечу что данная схема работала до сегодняшнего дня а тут не хочет.

компилер - Visual C++ 6.0

Это сообщение отредактировал(а) RENGIP - 3.6.2007, 17:26
PM   Вверх
nerezus
  Дата 3.6.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

getch ();
 нуту такой функции

P.S. вместо #include <iostream.h> пиши #include <iostream>


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
RENGIP
Дата 3.6.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Цитата(nerezus @ 3.6.2007,  17:25)
Цитата

getch ();
 нуту такой функции

P.S. вместо #include <iostream.h> пиши #include <iostream>

Код

#include <iostream>
#include <conio.h>

using std::cout;
using std::cin;

int main ()
{
    int n;

    cout << "Vvod: ";
    cin >> n;

    cout << "vivod: " << n;

    
    getch ();
    return 0;

}



Такой вариант работает как надо. Но возникает другой вопрос, почему они так отличаются обьясни.
PM   Вверх
comp
Дата 3.6.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



smile))
блин, это задача о рюкзаке, самая обычная задача на динамику, какой нафиг перебор.
PM MAIL   Вверх
RENGIP
Дата 3.6.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Цитата(comp @ 3.6.2007,  20:24)
smile))
блин, это задача о рюкзаке, самая обычная задача на динамику, какой нафиг перебор.

Читай внимательно вопрос в начале. Эта задача должна быть решена полным или ограниченным перебором. То что ты предлагаешь не подходит. Если у тебя есть варианты решения данным методом то можешь блиснуть а нет не засоряй форум. smile  
PM   Вверх
Greeen
Дата 3.6.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Цитата(RENGIP @  3.6.2007,  17:34 Найти цитируемый пост)
Но возникает другой вопрос, почему они так отличаются обьясни. 

Потому что cout и cin находятся в пространстве имен std.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.