Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 11

Задача о рюкзаке (перебор вариантов)

14.04.2020, 19:58. Показов 1234. Ответов 1

Студворк — интернет-сервис помощи студентам
извините, я бум бум
Постановка задачи. В рюкзак загружаются предметы n различных типов (количество предметов каждого типа не ограничено). Максимальный вес рюкзака W. Каждый предмет типа i имеет вес wi и стоимость vi (i=1,2, ..., n). Требуется определить максимальную стоимость груза, вес которого не превышает W. Обозначим количество предметов типа i через ki, тогда требуется максимизировать v1*k1+v2*k2+...+vn*kn при ограничениях w1*k1+w2*k2+...+wn*kn≤W, где ki - целые (0≤ki≤[W/wi]), квадратные скобки означают целую часть числа.

Рассмотрим простой переборный вариант решения задачи, работоспособный только для небольших значений n (определить, для каких?). Итак, данные:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Сonst MaxN=????;
 
 
Var n,w:integer;{количество предметов, максимальный вес}
 
Weight,Price:array[1..MaxN] of integer;{вес, стоимость предметов}
 
Best,Now:array[1..MaxN] of integer;{наилучшее, текущее решения}
 
MaxPrice:LongInt;{наибольшая стоимость}
 
Решение, его основная часть - процедура перебора:
 
Procedure Rec(k,w:integer;st:LongInt);
 
{k - порядковый номер группы предметов, w - вес, который следует набрать из оставшихся предметов, st - стоимость текущего решения}
 
var i:integer;
 
begin
 
if (k>n) and (st>MaxPrice) then begin {найдено решение}
 
Best:=Now;MaxPrice:=st; end
 
else if k<=n then
 
for i:=0 to w div Weight[k] do begin
 
Now[k]:=i;
 
Rec(k+1,W-i*Weight[k],st+i*Price[k]);
 
end;
 
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2020, 19:58
Ответы с готовыми решениями:

Задача на перебор вариантов. Задача Л.Эйлера. Про чиновника
Задача Л.Эйлера. Некий чиновник купил лошадей и быков на сумму 1770 талеров. За каждую лошадь он уплатил по 31 талеру, а за каждого быка по...

Задача на перебор вариантов
Помогите пожалуйста.Для заданного числа проверьте, является ли оно суммою квадратов двух чисел. Добавлено через 3 часа 14 минут ...

Перебор всех вариантов двухмерного массива
Здравствуйте, мне нужна Ваша помощь, я искал в интернете и думал своей головой, но решения данной проблемы не нашел. У меня есть...

1
 Аватар для canadamoscow
1179 / 430 / 194
Регистрация: 23.03.2020
Сообщений: 1,021
Записей в блоге: 1
15.04.2020, 08:49
Решение задачи упирается в расчет себестоимости (ценности каждого грамма предмета)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
begin
  var W := 20; //кг
  var kolvo := 30; //количество типов предметов
  var Ves := ArrRandomReal(kolvo, 0.5, 8); //Задаем вес каждого типа предмета
  var Cena := ArrRandom(kolvo, 1, 20); // Задаем стоимость каждого типа предмета
  var n := 0; // количество предметов в рюкзаке
  var vesTek := 0.0; // суммарный вес предметов в рюкзаке
  var CenaTek := 0.0; // суммарная стоимость предметов в рюкзаке
  var Sebest := new List<array of integer>; //себестоимость каждого типа предмета
  for var f := 0 to kolvo - 1 do 
    Sebest.Add(Arr(f, trunc(100000 * Cena[f] / Ves[f])));  
  //Список предметов упорядоченный по себестоимости (рентабельности)
  var Q := Sebest.OrderByDescending(t -> t[1]).Select(t -> t[0]).toArray;
  var j := 0; //индекс
  repeat
    while Ves[Q[j]] + VesTek <= W do //наполняем рюкзак от сначала самые дорогие и т.д.
    begin
      VesTek += Ves[Q[j]];
      CenaTek += Cena[Q[j]];
      inc(n);
      Writeln('+ предмет ', Q[j], '   вес: ', Ves[Q[j]]:0:3, '   Цена: ', Cena[Q[j]], '  Вес общий: ', VesTek:0:3,
                 '  Сумма общая: ', CenaTek);
    end;
    inc(j);
  until j = kolvo;
  Println('Итого самое дорогое', n, 'предметов на сумму', CenaTek);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2020, 08:49
Помогаю со студенческими работами здесь

Задача о Рюкзаке. Полный перебор
Здравствуйте, решаю задачу о рюкзаке. Нашел здесь способ (https://en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming) как можно...

задача на перебор вариантов
входные данные два массива 1 массив содержит суммы к примеру array(6,6,8) 2-массив содержит номиналы монет в котором ключ - это...

перебор вариантов...
имеется строка, содержащая слово. (например слово &quot;лампа&quot;) Как можно перебрать всевозможные сочитания букв этого слова? разбил слово на...

Перебор вариантов
Помогите, плиз! Три столбца, в каждом мугут быть числа от 10 до 90, причем только 10-20-...-90. Нужно перебрать все варианты таких троек...

Перебор вариантов
Доброе время суток Не получается решить задачу в лоб, слишком большое кол-во вариантов. Может у кого-нибудь есть идеи как ее решить по...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru