from itertools import combinations

# Жуковский Павел, 3 курс, 12 группа
# ИСО, Лабораторная Работа №2, Вариант 8

"""
Импресарио готовит выставку старинных автомобилей, среди которых могут быть Buggati, Cadillac, Cobra, Corvette,
Pierce Arrow, Studebaker. Опрос показал, что посмотреть именно Buggati придут 58 специально приглашенных гостей,
Cadillac — 37, Cobra — 42, Corvette — 40, Pierce Arrow — 55 и Studebaker — 33. Бюджет организации выставки составляет
15 млн y.e. Стоимость доставки автомобиля на выставку и обеспечение его сохранности составляют 6, 4, 3.8, 4.2, 5.5 и
3.2 млн y.e. соответственно. Задача импресарио в том, чтобы привлечь как можно больше специально приглашенных гостей,
не превышая бюджет на организацию. Кроме того, на выставке должно быть не менее трех старинных автомобилей. Если
Corvette будет выбран для выставки, то и Cobra должен там быть. Если же Buggati отсутствует, то обязательно нужно
включить в показ Cadillac. Постройте математическую модель и найдите оптимальное решение задачи. Определите, каким
может быть минимальный и максимальный бюджет, чтобы выставка состоялась.
"""

# Список из троек вида: (Название машины, стоимость обслуживания машины, количество зрителей)
cars = (("Buggati", 6000000, 58), ("Cadillac", 4000000, 37), ("Cobra", 3800000, 42),
        ("Corvette", 4200000, 40), ("Pierce Arrow", 5500000, 55), ("Studebaker", 3200000, 33))

# Бюджет организации
budget = 15000000

# Список всех выборок машин
all_samples = []

# Для решения этой задачи нам достаточно перебрать 42 случая выборок машин
# Множества всех выборок по три машины - 20 выборок
# Множества всех выборок по четыре машины - 15 выборок
# Множества всех выборок по пять машин - 6 выборок
# Множества всех выборок по шесть машин - 1 выборка
for num in range(3, 7):  # Список выборок (сначала из трёх, потом из четырёх и так далее)
    curr_sample_list = []
    for combination in combinations(cars, num):
        cars_list = list(combination)
        curr_sample_list.append(cars_list)
    all_samples.append(curr_sample_list)  # К общему списку выборок прибавляем новый список (сначала из трёх, потом из четырёх и так далее)

# Объединяем список из 4-ёх списков выборок в один большой список выборок
all_samples = sum(all_samples, [])

# Минимальный бюджет, необходимый для самой дешёвой, но допустимой выставки машин
min_budget = budget
# Максимальное число гостей, которое удастся собрать на самой дешёвой допустимой выставке
min_budget_guests = 0
# Выборка машин для самой дешёвой выставки
min_budget_sample = ()

# Максимальный бюджет, необходимый для самой дорогой, но в тоже время допустимой по средствам, выставки машин
max_budget = 0
# Максимальное число гостей, которое удастся собрать на самой дорогой допустимой выставке
max_budget_guests = 0
# Выборка машин для самой дорогой допустимой выставки
max_budget_sample = ()

for exhibition in all_samples:
    curr_cost = 0  # Стоимость текущей выставки
    curr_guests = 0  # Количество гостей текущей выставки
    if ("Corvette", 4200000, 40) in exhibition and ("Cobra", 3800000, 42) not in exhibition:
        exhibition.append(("Cobra", 3800000, 42))
    if ("Buggati", 6000000, 58) not in exhibition and ("Cadillac", 4000000, 37) not in exhibition:
        exhibition.append(("Cadillac", 4000000, 37))
    for curr_car in exhibition:
        car, car_cost, car_guests = curr_car
        curr_cost += car_cost
        curr_guests += car_guests
    if curr_cost < budget:  # Если общая стоимость обслуживания получилась меньше, чем нам позволяет бюджет
        if curr_cost < min_budget:  # Если общая стоимость обслуживания меньше самого дешёвого варианта
            min_budget = curr_cost  # Фиксируем сумму для самого дешёвого варианта
            min_budget_guests = curr_guests  # Фиксируем гостей для самого дешёвого варианта
            min_budget_sample = exhibition  # Фиксируем выборку машин этой выставки
        if curr_guests > max_budget_guests:  # Если количество гостей больше максимального
            max_budget = curr_cost  # Фиксируем бюджет, который мы на это затратим
            max_budget_guests = curr_guests  # Фиксируем максимальное количество гостей
            max_budget_sample = exhibition  # Фиксируем выборку машин этой выставки

print("В результате работы программы были расчитаны две наиболее эффективные тактики для организации выставки:")
print("1) Самая дешёвая в плане средств, но в же тоже время допустимая выставка")
print("Общая стоимость:", min_budget)
print("Количество гостей:", min_budget_guests)
print("Машины данной выставки:")
for car in min_budget_sample:
    print('"' + car[0] + '"')
print("2) Самая дорогая в плане средств и эффективная в плане количества гостей, но в же тоже время допустимая выставка")
print("Общая стоимость:", max_budget)
print("Количество гостей:", max_budget_guests)
print("Машины данной выставки:")
for car in max_budget_sample:
    print('"' + car[0] + '"')
