import argparse
from gurobipy import Model, GRB, quicksum

def minimize_max_value(i, m, M, target_sum):
    model = Model("minimize_max_value")

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

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

    # Nebenbedingungen
    model.addConstr(quicksum(x[j] for j in range(i)) == target_sum, name="sum_constraint")
    for j in range(i):
        model.addConstr(x[j] <= T, name=f"max_constraint_{j}")
        model.addConstr(x[j] <= M * b[j], name=f"binary_max_constraint_{j}")
        model.addConstr(x[j] >= m * b[j], name=f"binary_min_constraint_{j}")

    model.optimize()

    # Ergebnis ausgeben
    if model.status == GRB.OPTIMAL:
        solution = [x[j].x for j in range(i) if b[j].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.')
    parser.add_argument('i', type=int, help='number of variables')
    parser.add_argument('m', type=int, help='minimum value for variables')
    parser.add_argument('M', type=int, help='maximum value for variables')
    parser.add_argument('target_sum', type=int, help='the target sum')
    
    args = parser.parse_args()
    minimize_max_value(args.i, args.m, args.M, args.target_sum)
