Как заполнить продуктами целый шкаф

Всё, послед­няя тре­вож­ная задач­ка меся­ца. Даль­ше задач­ки будут толь­ко жиз­не­утвер­жда­ю­щие и пози­тив­ные. А пока — пани­ка и тре­во­га. В послед­ний раз мож­но.

Кило­грам­мо­вая пач­ка фасо­ли сто­ит 78 руб­лей и зани­ма­ет 0,7 лит­ра в объ­ё­ме, а такая же пач­ка мака­рон — 25 руб­лей и зани­ма­ет 1,35 лит­ра. У нас есть 5000 руб­лей. Чего и сколь­ко нуж­но купить, что­бы вес ито­го­вых про­дук­тов полу­чил­ся мак­си­маль­ным, если в шкаф вле­за­ет не боль­ше двух­сот лит­ров про­дук­тов.

Эту задач­ку мож­но решить вруч­ную с помо­щью мате­ма­ти­ки или с помо­щью кода: напи­сать про­грам­му, кото­рая пере­бе­рёт все зна­че­ния и най­дёт опти­маль­ное. Гораз­до про­ще потра­тить три мину­ты на напи­са­ние кода и началь­ных усло­вий, чем час на само реше­ние.

Смысл кода будет такой: мы дадим ком­пью­те­ру зада­ние пере­брать все воз­мож­ные вари­ан­ты и пока­зать те, кото­рые под­хо­дят под наши усло­вия. Нам оста­ёт­ся толь­ко най­ти гра­ни­цы для пере­бо­ра и про­ду­мать усло­вия.

Так как в шка­фу все­го 200 лит­ров, то выяс­ним, сколь­ко мак­си­мум одно­го това­ра мы можем в него впих­нуть:

фасоль — 200 / 0,7 = 285,7. Но так как 0,7 пач­ки не вле­за­ют, оста­ёт­ся 285 пачек фасо­ли — мак­си­мум в шка­фу.

мака­ро­ны — 200 / 1,35 = 148,1. Полу­ча­ет­ся, что если класть толь­ко их, то вле­зет 148 пачек мака­рон.

Теперь в этих гра­ни­цах мы мето­дом про­сто­го пере­бо­ра про­сто про­смот­рим все ком­би­на­ции, кото­рые мож­но полу­чить. Наша зада­ча — най­ти мак­си­маль­ный вес, кото­рый мож­но поло­жить в шкаф, учи­ты­вая огра­ни­че­ния по объ­ё­му и бюд­же­ту. 

Для это­го мы в самом нача­ле сде­ла­ем пере­мен­ную, кото­рая отве­ча­ет за мак­си­маль­ный вес, и будем на каж­дом шаге смот­реть — теку­щая ком­би­на­ция весит боль­ше или нет. Если боль­ше, чем теку­щее зна­че­ние пере­мен­ной, то запи­сы­ва­ем в неё новый мак­си­маль­ный вес и запо­ми­на­ем коли­че­ство пачек каж­до­го това­ра. 

Когда цикл закон­чит­ся, нам оста­нет­ся толь­ко выве­сти эти зна­че­ния — они и будут нашим отве­том. Поеха­ли писать код на Python:

# наш бюджет
money = 5000
# цена и объём фасоли
buckwheat_cost = 78
buckwheat_vol = 0.7
# цена и объём макарон
pasta_cost = 25
pasta_vol = 1.35
# задаём минимальные и максимальные количества упаковок каждого товара
buckwheat_all = range(0,286)
pasta_all = range(0,149)
# сюда мы положим результаты поиска
weight_max = 0
buckwheat_max = 0
pasta_max = 0
# перебираем все варианты с фасолью…
for buckwheat in buckwheat_all:
  # … и макаронами
  for pasta in pasta_all:
    # берём получившееся количество упаковок и проверяем цену и объём
    # если помещается в шкаф и бюджет и у этого набора максимальный вес на этом этапе — запоминаем значения
    if buckwheat * buckwheat_cost + pasta * pasta_cost <= 5000  and buckwheat * buckwheat_vol + pasta * pasta_vol <= 200 and buckwheat + pasta > weight_max:
      # записываем значения в нужные переменные
      buckwheat_max = buckwheat
      pasta_max = pasta
      # каждая пачка весит 1 кило, поэтому для веса нам нужно просто сложить общее количество пачек
      weight_max = buckwheat + pasta
# в конце просто выводим то, что даст нам максимальный результат
print('Максимальный вес: ', weight_max, ' кг., пачек фасоли: ',buckwheat_max,', пачек макарон: ', pasta_max)

Запу­сти­те код, что­бы узнать пра­виль­ный ответ. Есть ещё и вто­рой, но наше­му коду доста­точ­но пер­во­го.