Competitive Programming Academy · Урок

Дробный рюкзак по соотношению

Сначала берите элементы с наибольшей ценностью на единицу веса

Урок 3 из 413 шагов

«Дробный рюкзак по соотношению» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 4 уроков всего.

Постановка задачи о рюкзаке

У вас есть предметы с определённой ценностью и весом, а также рюкзак с ограниченной вместимостью. Цель — перенести как можно большую суммарную ценность. 🎒

Дробный вариант допускает деление

В дробном варианте можно взять часть предмета, например половину мешка зерна. Именно эта свобода позволяет жадному алгоритму победить.

Ценность на единицу веса

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

ratio = value / weight

Сортировка по лучшему отношению

Отсортируйте предметы по ценности на единицу веса, начиная с наибольшей. Жадный план состоит в том, чтобы всегда брать самый плотный по ценности доступный предмет.

items.sort(key=lambda i: i[0] / i[1], reverse=True)

Берите целиком, пока помещается

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

if weight <= cap:
    total += value
    cap -= weight

Заполните последний промежуток

Когда предмет слишком велик, возьмите долю, которая точно заполнит оставшееся место. После этого рюкзак заполнен, и можно остановиться.

total += value * (cap / weight)

Почему порядок по отношению работает

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

Задача о рюкзаке 0/1 устроена иначе

Если предметы нельзя разделять, жадный выбор по отношению не работает. Для варианта 0/1 нужно динамическое программирование, а не такая простая сортировка.

Время выполнения

Сортировка по отношению требует O(n log n), а цикл заполнения работает за линейное время. Для обычных ограничений на соревнованиях этого более чем достаточно.

Следите за последней дробью

Для части предмета используйте числа с плавающей точкой или точные рациональные числа. Раннее усечение может уменьшить ценность и привести к неправильному ответу.

Где это встречается

Представьте погрузку груза, смешивание топлива или разделение ресурсов. Если предметы можно делить, жадный алгоритм по отношению — Ваш инструмент.

Быстрая проверка

Вы заполняете сумку в задаче о рюкзаке с дробными предметами.

Итоги

Отсортируйте предметы по ценности на единицу веса, берите целые предметы, пока они помещаются, а затем добавьте дробную часть, чтобы заполнить сумку. Этот жадный алгоритм оптимален только тогда, когда предметы можно разделять. 🚀

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Дробный рюкзак по соотношению» бесплатный?

Да — полный текст урока «Дробный рюкзак по соотношению» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.

Чему я научусь в уроке «Дробный рюкзак по соотношению»?

Сначала берите элементы с наибольшей ценностью на единицу веса Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Competitive Programming Academy?

Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Дробный рюкзак по соотношению»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Competitive Programming Academy?

Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Жадный подход
  2. Выбор активностей по самому раннему завершению
  3. Дробный рюкзак по соотношению
  4. Как заметить, что жадный подход не работает
← Назад к Competitive Programming Academy