import argparse
from gurobipy import Model, GRB, quicksum

def minimize_max_value_with_fixed_numbers(fixed_numbers, target_sum):
    n = len(fixed_numbers)
    
    model = Model("minimize_max_value_with_fixed_numbers")

    # Entscheidungsvariablen
    b = model.addVars(n, vtype=GRB.BINARY, name="b")
    T = model.addVar(vtype=GRB.INTEGER, name="T")

    # Zielfunktion
    model.setObjective(T, GRB.MINIMIZE)

    # Nebenbedingungen
    model.addConstr(quicksum(fixed_numbers[i] * b[i] for i in range(n)) == target_sum, name="sum_constraint")
    for i in range(n):
        model.addConstr(fixed_numbers[i] * b[i] <= T, name=f"max_constraint_{i}")

    model.optimize()

    # Ergebnis ausgeben
    if model.status == GRB.OPTIMAL:
        solution = [fixed_numbers[i] for i in range(n) if b[i].x > 0.5]
        print("Optimale Lösung gefunden:")
        print(f"Verwendete Zahlen: {solution}")
        print(f"Maximaler Wert (T): {T.x}")
    else:
        print("Keine optimale Lösung gefunden")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Minimize the maximum value of a subset that sums to a target with fixed numbers.')
    parser.add_argument('fixed_numbers', metavar='N', type=int, nargs='+', help='an integer for the list of fixed numbers')
    parser.add_argument('target_sum', metavar='T', type=int, help='the target sum')
    
    args = parser.parse_args()
    minimize_max_value_with_fixed_numbers(args.fixed_numbers, args.target_sum)

