Одним из подходов является динамическое программирование.
Идея состоит в том, что если покупателю нужны x элемента A, y элемента B и z элемента C, то вы должны вычислить все тройки (x ', y', z ') с 0 <= x' <= x и 0 <= y '<= y и 0 <= z' <= z самый дешевый способ получить хотя бы x 'из A, y' из B и z 'из C. Псевдокод: </p>
for x' = 0 to x
for y' = 0 to y
for z' = 0 to z
cheapest[(x', y', z')] = min over all packages p of (price(p) + cheapest[residual demand after buying p])
next_package[(x', y', z')] = the best package p
Затем вы можете вернуться назад (x, y, z), добавив в корзину пакеты, указанные в next_package.
Если есть много разных видов предметов или их много, лучше выбрать ветвь и границу.