Как найти минимальное количество непересекающихся подмножеств с максимальной суммой и размером
Я ищу, чтобы найти минимальное количество непересекающихся подмножеств (мы будем обозначать эти b_i
) из набора (мы будем обозначать X
) такой что все b_i
удовлетворить следующие ограничения:
- Каждый элемент
x_i
изX
должны быть помещены ровно в одну партию. len(b_i) <= MAX_ELEMENTS_PER_BATCH
для всехi
sum(b_i) <= MAX_SUM_PER_BATCH
для всехi
Я придумал эвристику для поиска партий, которые удовлетворяют ограничениям, но это не гарантирует минимальное количество партий.
Например:
- Сортировать коллекцию.
- Возьмите самый большой элемент и вставьте его в свою партию.
- Заполните пакет наименьшими элементами, пока добавление следующего элемента не приведет к превышению суммы пакета
MAX_SUM_PER_BATCH
, - Удалить элементы из этой партии из коллекции
- Повторите шаги 2-4, пока не останется никаких элементов.
Я понимаю, что это, вероятно, решаемая проблема с каким-то именем, о котором я не знаю, и что оптимизация для минимального количества партий вносит здесь сложность.
Псевдокод, python или java в ваших ответах, пожалуйста.
1 ответ
Как насчет:
Сортировать коллекцию (от самой большой до самой маленькой)
Возьмите следующий элемент коллекции и попробуйте вписать его в существующие партии (начиная с первого созданного пакета) на основе 2 правил.
Если подходит, добавьте в пакет и вернитесь к 2. В противном случае создайте новый пакет, добавьте к нему и вернитесь к 2
Я считаю, что он удовлетворяет всем условиям, и нужно только 1 линейный проход для коллекции после сортировки
Изменить: может быть более эффективным также сохранить текущую сумму пакета, чтобы не пересчитывать ее каждый раз