IyBEYXRvcyBkZWwgcHJvYmxlbWEKTiA9IDEwICAjIG4mdWFjdXRlO21lcm8gZGUgb2JqZXRvcwpNID0gMyAgICMgbiZ1YWN1dGU7bWVybyBkZSBtb2NoaWxhcwpQID0gWzY4LCAzMywgNDUsIDM1LCAyNiwgNDcsIDQxLCA1OSwgNTMsIDI0XSAgIyBwZXNvcyBkZSBsb3Mgb2JqZXRvcwpWID0gWzQwLCAzNCwgNDcsIDQ1LCAyMiwgMjYsIDQ0LCAyMiwgNDAsIDIwXSAgIyB2YWxvcmVzIGRlIGxvcyBvYmpldG9zCksgPSBbMTI4LCAxMTgsIDEyMV0gICMgY2FwYWNpZGFkZXMgZGUgbGFzIG1vY2hpbGFzCiAKIyBDcmVhciBlbCBwcm9ibGVtYSBkZSBtYXhpbWl6YWNpJm9hY3V0ZTtuCnByb2JsZW0gPSBMcFByb2JsZW0oJnF1b3Q7TXVsdGktS25hcHNhY2stUHJvYmxlbSZxdW90OywgTHBNYXhpbWl6ZSkKIAojIFZhcmlhYmxlcyBkZSBkZWNpc2kmb2FjdXRlO246IHhbaV1bal0gaW5kaWNhIHNpIGVsIG9iamV0byBpIGVzdCZhYWN1dGU7IGVuIGxhIG1vY2hpbGEgagp4ID0gW1tMcFZhcmlhYmxlKGYmcXVvdDt4X3tpfV97an0mcXVvdDssIGNhdD0mcXVvdDtCaW5hcnkmcXVvdDspIGZvciBqIGluIHJhbmdlKE0pXSBmb3IgaSBpbiByYW5nZShOKV0KIAojIEZ1bmNpJm9hY3V0ZTtuIG9iamV0aXZvOiBtYXhpbWl6YXIgZWwgdmFsb3IgdG90YWwKcHJvYmxlbSArPSBscFN1bShWW2ldICogeFtpXVtqXSBmb3IgaSBpbiByYW5nZShOKSBmb3IgaiBpbiByYW5nZShNKSkKIAojIFJlc3RyaWNjaW9uZXMgZGUgY2FwYWNpZGFkIHBhcmEgY2FkYSBtb2NoaWxhCmZvciBqIGluIHJhbmdlKE0pOgogICAgcHJvYmxlbSArPSBscFN1bShQW2ldICogeFtpXVtqXSBmb3IgaSBpbiByYW5nZShOKSkgJmx0Oz0gS1tqXSwgZiZxdW90O0NhcGFjaWRhZF9tb2NoaWxhX3tqfSZxdW90OwogCiMgUmVzdHJpY2NpJm9hY3V0ZTtuIGRlIHVuaWNpZGFkOiBjYWRhIG9iamV0byBkZWJlIGVzdGFyIGVuIHVuYSAmdWFjdXRlO25pY2EgbW9jaGlsYQpmb3IgaSBpbiByYW5nZShOKToKICAgIHByb2JsZW0gKz0gbHBTdW0oeFtpXVtqXSBmb3IgaiBpbiByYW5nZShNKSkgJmx0Oz0gMSwgZiZxdW90O1VuaWNpZGFkX29iamV0b197aX0mcXVvdDsKIAojIFJlc29sdmVyIGVsIHByb2JsZW1hCnByb2JsZW0uc29sdmUoKQogCiMgSW1wcmltaXIgZWwgdmFsb3IgJm9hY3V0ZTtwdGltbyBkZSBsYSBmdW5jaSZvYWN1dGU7biBvYmpldGl2bwp2YWxvcl9vcHRpbW8gPSBwcm9ibGVtLm9iamVjdGl2ZS52YWx1ZSgpCnByaW50KGYmcXVvdDtWYWxvciAmb2FjdXRlO3B0aW1vIGRlIGxhIGZ1bmNpJm9hY3V0ZTtuIG9iamV0aXZvOiB7dmFsb3Jfb3B0aW1vfSAmZXVybzsmcXVvdDspCiAKIyBJbXByaW1pciBsYSBhc2lnbmFjaSZvYWN1dGU7biAmb2FjdXRlO3B0aW1hIGRlIGxvcyBvYmpldG9zCmZvciBpIGluIHJhbmdlKE4pOgogICAgZm9yIGogaW4gcmFuZ2UoTSk6CiAgICAgICAgaWYgeFtpXVtqXS52YWx1ZSgpID09IDE6CiAgICAgICAgICAgIHByaW50KGYmcXVvdDtPYmpldG8ge2krMX0gYXNpZ25hZG8gYSBsYSBtb2NoaWxhIHtqKzF9JnF1b3Q7KQ==
# Datos del problema
N = 10 # número de objetos
M = 3 # número de mochilas
P = [68, 33, 45, 35, 26, 47, 41, 59, 53, 24] # pesos de los objetos
V = [40, 34, 47, 45, 22, 26, 44, 22, 40, 20] # valores de los objetos
K = [128, 118, 121] # capacidades de las mochilas
# Crear el problema de maximización
problem = LpProblem("Multi-Knapsack-Problem", LpMaximize)
# Variables de decisión: x[i][j] indica si el objeto i está en la mochila j
x = [[LpVariable(f"x_{i}_{j}", cat="Binary") for j in range(M)] for i in range(N)]
# Función objetivo: maximizar el valor total
problem += lpSum(V[i] * x[i][j] for i in range(N) for j in range(M))
# Restricciones de capacidad para cada mochila
for j in range(M):
problem += lpSum(P[i] * x[i][j] for i in range(N)) <= K[j], f"Capacidad_mochila_{j}"
# Restricción de unicidad: cada objeto debe estar en una única mochila
for i in range(N):
problem += lpSum(x[i][j] for j in range(M)) <= 1, f"Unicidad_objeto_{i}"
# Resolver el problema
problem.solve()
# Imprimir el valor óptimo de la función objetivo
valor_optimo = problem.objective.value()
print(f"Valor óptimo de la función objetivo: {valor_optimo} €")
# Imprimir la asignación óptima de los objetos
for i in range(N):
for j in range(M):
if x[i][j].value() == 1:
print(f"Objeto {i+1} asignado a la mochila {j+1}")