Одна из классических задач по упаковке.
Существует некоторый контейнер с максимальной грузоподъёмностью
W. Существует
N грузов
ei. Каждый груз имеет две характеристики - вес
wi и стоимость
vi (1 <
i <=
N). Считаем, что геометрические особенности грузов и контейнера несущественны, и единственная характеристика - это вес. Набор предметов может быть помещён в контейнер, если суммарный вес набора не превышает
W. Каждый предмет можно выбрать только
один раз.
Дан входной набор данных для грузов
ei, который представляет собой массив из пар значений - веса предмета
wi и стоимости предмета
vi - пусть для определённости это будет реализовано как ассоциативный массив с ключами
weight и
value. Дано также число
W. Все значения весов и стоимостей, а также грузоподъёмность контейнера
W - являются
положительными целыми числами.
Для определённости также считаем, что 0 <
W <=100 и 0 <
wi <=100 (то есть все веса предметов, а также грузоподъёмность контейнера больше нуля и меньше либо равны 100).
Далее, количество грузов
N тоже положительно (не может быть пустого набора) и не превышает 1E5
Требуется - по данному набору предметов {
ei} и числу
W найти число
V, которое является максимальной суммарной стоимостью предметов, которые удалось поместить в контейнер (сумма весов этих предметов не превышает
W) - то есть написать функцию
getMaxValue, принимающую два параметра - набор грузов и величину
W, и возвращающую единственное целое число
V - максимально достижимую стоимость набора предметов, которые можно поместить в контейнер.
Пример:
PHP:
скопировать код в буфер обмена
$rgData = [
['weight'=>2, 'value'=>4],
['weight'=>5, 'value'=>7],
['weight'=>1, 'value'=>3],
['weight'=>3, 'value'=>4]
];
$iMaxWeight = 5;
var_dump(getMaxValue
($rgData, $iMaxWeight)); //8