Giter Site home page Giter Site logo

backpack's Introduction

Задача о рюкзаке

Условие

Имеется рюкзак вместимостью N кг.

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

Необходимо найти такую выборку предметов, которая помещается в рюкзак (суммарный вес не превышает вместимость) и имеет максимальную стоимость из всех возможных вариантов.

Каждый предмет можно положить в рюкзак один раз. Вес и стоимость - целые числа.

Пример

Рюкзак вместимостью 4 кг.

Предметы:

  • магнитофон (вес=4, стоимость=3000)
  • гитара (вес=1, стоимость=1500)
  • ноутбук (вес=3, стоимость=2000)

Решение

Алгоритм решения взят из книги "Грокаем алгоритмы", автор Адитья Бхаргава.

Для решения необходимо создать множество рюкзаков с меньшей вместимостью. Поскольку по условию задачи у нас целые числа, и итоговый рюкзак вмещает 4 кг., то наше множество это 4 рюкзака с вместимостью 1,2,3,4. На старте каждый рюкзак пустой. В скобках указан набор предметов, после знака "=" общая стоимость выбранных предметов.

Рюкзак-1 Рюкзак-2 Рюкзак-3 Рюкзак-4
() = 0 () = 0 () = 0 () = 0

Внешний цикл: Перебираем предметы. Порядок перебора не имеет значения.

Внутреннй цикл: Для каждого рюкзака проверяем:

  1. Помещается предмет в рюкзак? Если нет - содержимое рюкзака копируем из предыдущего шага итерации, переходим к следующему рюкзаку (пункты 2-3 пропускаем).
  2. Если предмет помещается, то кладем его во временный список, вычисляем какой еще вес мы можем добавить в текущий рюкзак. Если значение больше нуля(обозначим его M), то во временный список добавляем список предметов из рюкзака-M предыдущего шага итерации.
  3. Вычисляем стоимость предметов временного списка. Если она больше, чем на предыдущем шаге итерации, то заменяем содержимое рюкзака, иначе копируем старый набор.

По завершении обоих циклов в последнем рюкзаке будет оптимальный набор предметов

Рассмотрим на нашем примере

Исходные (пустые) наборы для каждого рюкзака:

Рюкзак-1 Рюкзак-2 Рюкзак-3 Рюкзак-4
() = 0 () = 0 () = 0 () = 0

Первый предмет - магнитофон (вес=4, стоимость=3000)

В первые три рюкзака он не помещается, копируем старые данные. Рюкзак-4 он заполняет полностью, его стоимость 3000, это больше предыдущего значения (0), значит обновляем данные.

Рюкзак-1 Рюкзак-2 Рюкзак-3 Рюкзак-4
() = 0 () = 0 () = 0 (м) = 3000

Второй предмет - гитара (вес=1, стоимость=1500).

В рюкзак-1 предмет помещается, заполняет полностью. Стоимость больше предыдущего значения(0), обновляем данные. В рюкзак-2 предмет помещается, можно дополнить еще на 1 кг. Смотрим рюкзак-1 из предыдущего шага - там пусто. Значит в нашем новом списке только текущий предмет. Его стоимость больше предыдущего значения(0), обновляем данные. Аналогично с третьим рюкзаком, обновляем данные. Рюкзак-4 - предмет помещается, можно добавить 3 кг. Рюкзак-3 с предыдущего шага итерации пустой, стоимость текущего предмета меньше, значит копируем старые данные.

Рюкзак-1 Рюкзак-2 Рюкзак-3 Рюкзак-4
(г) = 1500 (г) = 1500 (г) = 1500 (м) = 3000

Третий предмет - ноутбук (вес=3, стоимость=2000).

В первые два рюкзака не помещается, копируем старые данные. Рюкзак-3 - помещается, заполняет полностью, стоимость выше, обновляем данные. Рюкзак-4 - помещается, можно добавить еще 1кг. На предыдущем шаге итерации рюкзак-1 - это гитара стоимостью 1500. Суммарная стоимость нового списка - 3500. Это больше предыдущего значения (3000), обновляем данные.

Рюкзак-1 Рюкзак-2 Рюкзак-3 Рюкзак-4
(г) = 1500 (г) = 1500 (н) = 2000 (н, г) = 3500

Результат

В рюкзаке-4 находится искомый список. Ноутбук + гитара, общей стоимостью 3500.

backpack's People

Contributors

zxc17 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.