Форум программистов, компьютерный форум CyberForum.ru

Задача о рюкзаке 0-1 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Linus
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 6
27.12.2012, 16:41     Задача о рюкзаке 0-1 #1
Здравствуйте!
Есть задача о ранце, где даны вес и ценность каждого предмета, а также общая вместимость ранца. Нужно найти максимальную ценность предметов, которые можно поместить в рюкзак.
Для не слишком больших входных параметров можно воспользоваться вот таким рекурсивным способом и все прекрасно работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int knapSack(int W, int wt[], int val[], int n)
{
   
   if (n == 0 || W == 0)
       return 0;
 
   if (wt[n-1] > W)
       return knapSack(W, wt, val, n-1);
 
   else return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
                    knapSack(W, wt, val, n-1)
                  );
}
Сложность такого алгоритма O(2^n).
Но что делать, если, к примеру, общая ценность предметов, которые могут поместиться в рюкзак составляет 4000000, а количество самих предметов превышает 1000? Как я понимаю, время вычисления будет огромным. Я пробовал итеративный способ, но создавать матрицу[1000][4000000] visual studio отказался, да и страшно представить сколько тут понадобится памяти.
Я читал про мемоизацию, но не понял, как её можно реализовать здесь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2012, 16:41     Задача о рюкзаке 0-1
Посмотрите здесь:

C++ Задача о рюкзаке
Задача о рюкзаке C++
C++ Задача о рюкзаке
C++ Задача о рюкзаке
C++ исправьте ошибки в программе о рюкзаке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.12.2012, 17:51     Задача о рюкзаке 0-1 #2
Linus, Заводите одномерный массив размером W + 1, на каждой k-й итерации вычисляете оптимальное значение для k первых вещей. Потребляемая память - W + 1, сложность - O(W * n)
Linus
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 6
27.12.2012, 19:40  [ТС]     Задача о рюкзаке 0-1 #3
Спасибо за идею =)
vlad-chk
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 50
05.12.2014, 20:16     Задача о рюкзаке 0-1 #4
А как запоминать взятые в рюкзак вещи?
Yandex
Объявления
05.12.2014, 20:16     Задача о рюкзаке 0-1
Ответ Создать тему
Опции темы

Текущее время: 01:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru