задача о ранце/python
Есть такая задача:
Группа студентов из n девушек и m парней собирается в поход. Самостоятельно задать продукты и предметы, а также их вес. Необходимо так распределить предметы и продукты по рюкзакам, чтобы общий вес каждой девушки не превышал 5 кг, а парней – не более 15
Я вроде как реализовала её, но при вводе:
Количество парней:
5
Количество девушек:
5
Введите вес каждого предмета:
5 5 5 5 5 5 5 5 5 5
Количество вещей: 10
происходит ошибка после попытки расчёта для 2-го рюкзака для парня. Может подскажете, как исправить это, или может есть другие алгоритмы для расчёта данной задачи? Код:
import random
print("Количество парней: ")
n = int(input())
print("Количество девушек: ")
m = int(input())
# print("Количество вещей: ")
# k = int(input())
print("Введите вес каждого предмета: ")
X = [int(el) for el in input().split()]
k = len(X)
print("Количество вещей: ", k)
Y = random.sample(range(1, k + 1), k)
W_g = 5
W_b = 15
def knapsack(W, weight, cost, n):
K = [[0 for x in range(W + 1)] for x in range(n + 1)]
for i in range(n + 1):
for w in range(W + 1):
if i == 0 or w == 0:
K[i][w] = 0
elif weight[i - 1] <= w:
K[i][w] = max(cost[i - 1] + K[i - 1][w - weight[i - 1]], K[i - 1][w])
else:
K[i][w] = K[i - 1][w]
return K
def completion(Y, X, W, K, k):
kol = 0
w, i, total_weight = W, n, 0
res = K[n][W]
while i > 0 and res > 0:
if res != K[i - 1][w]:
print(i, "\b-й предмет, ценой", Y[i - 1], "и веса", X[i - 1])
total_weight += X[i - 1]
res -= Y[i - 1]
w -= X[i - 1]
kol += 1
del X[i - 1], Y[i - 1]
i -= 1
print("Общий вес предметов:", total_weight, "\b, стоимость:", K[n][W])
k -= kol
return X, Y, k
# заполнение рюкзаков девушек
for i in range(m):
if k > 0:
print("\n\nОсталось вещей ", k)
print("Ценность вещей: ", Y)
print("Вес вещей: ", X)
K = knapsack(W_g, X, Y, k)
print(K)
print("Заполнение рюкзака девушки № \b", i + 1)
X, Y, k = completion(Y, X, W_g, K, k)
else:
print("Все предметы разложены!")
break
# заполнение рюкзаков мальчиков
for i in range(n):
if k > 0:
print("\n\nОсталось вещей ", k)
print("Ценность вещей: ", Y)
print("Вес вещей: ", X)
K = knapsack(W_b, X, Y, k)
print (K)
print("Заполнение рюкзака парня № \b", i + 1)
X, Y, k = completion(Y, X, W_b, K, k)
else:
print("Все предметы разложены!")
break