Жаль, что я не знаю ни палп, ни питон, но всё-таки могу посоветовать кое-что попробовать.
Ваша задача вроде бы и есть задача о рюкзаке практически.
Проблема видна в бесконечном количестве переменных (в статье, на которую вы ссылаетесь, переменных всего три), но, скорее всего, библиотека позволяет что-то вроде такого:
LpVariable cond = LpVariable(«cond», ...) // это будет цена набора
LpVariable cond_num = LpVariable(«cond_num», ...) // это будет размер набора
for each cocktail:
.. tmp = LpVariable(cocktail.name, ...)
.. cond = cond + tmp * cocktail.price // складываем цены
.. cond_num = cond_num + tmp // складываем количества
.. problem += tmp <= MAX, concat(«c», i) // каждый коктейль входит столько-то раз (или там <= cocktail.max, я не знаю)
// я не знаю, как в питоне клеить строчки, i — это счетчик, пусть он начинается с 3, номера 1 и 2 зарезервируем
Наверное, у cond должен быть какой-то другой тип, что-то типо Expression, надо документацию читать.
Потом,
problem += cond == CASH, «c1»
problem += cond_num == CHECK_LEN, «c2»
и, например,
problem += 5, «obj»
Надо глянуть, как себя поведет решатель при множестве вариантов ответа.
Я честно не знаю, имеет ли всё что я написал какой-то смысл (не разбираюсь, код копировал из статьи по ссылке), можете попробовать, если вариантов больше не будет. Надеюсь, как-то поможет.