Мне была поставлена задача - решить следующую задачу программирования:
Козы
Джордж со своим стадом коз на берегу реки. Он хочет пройти через реку со своими козами, используя плот с ограниченной грузоподъемностью, не более чем K курсов. У него все козлы разные, с разным весом. Он хочет подсчитать, какова минимальная вместимость плота, которая могла бы пройти всех его N коз через реку с не более чем K курсами.
Однако у него есть правила, которые он должен соблюдать:
В каждом курсе он сначала кладет на плот самый тяжелый из имеющихся козлов, затем из оставшихся он снова кладет самого тяжелого козла, который не будет слишком тяжелым для вместимости плота, затем следующего и так далее, пока не останется больше коз, которые могут пойти на плоту из-за его вместимости. После этого он доставляет их на другой берег (делает курс) и возвращается, чтобы получить больше коз на плоту и пройти другой курс. (Вместимость плота должна быть не меньше, чем вес самого тяжелого козла)
Таким образом, мне нужно написать скрипт, который вычисляет минимальную вместимость плота с заданным количеством курсов K , количество коз N и вес каждый из них ( А1, А2 и т. д.). Поскольку Джордж является относительно небольшой константой, вес Джорджа игнорируется (нет необходимости добавлять его в расчеты).
Все, что было отмечено до сих пор, соответствует требованиям испытания.
Пример результата правильного решения:
6 коз, 2 блюда
Вес каждой козы: 26, 7, 10, 30, 5, 4
Результат (минимальная вместимость плота): 42
Курсы: (30, 10); (26, 7, 5, 4)
Следующее решение не следует правилам: (30, 7, 4); (26, 10, 5) - потому что коза, которая весит 10 кг, может быть в первом курсе и должна быть там согласно правилам.
Моя попытка решения:
import itertools
goatnum = 0
courses = 0
goatw = []
counter = 0
goatnum = int(input("Enter the number of goats: "))
courses = int(input("Enter the number of courses: "))
for g in range(goatnum):
goatw.append(int(input("Enter the weight of goat #{}: ".format(g+1))))
goatw = sorted(goatw, reverse=True)
goats = sum(goatw)
result = []
permlen = len(goatw)/courses
while not result:
result = [seq for i in range(len(goatw), 0, -1) for seq in itertools.permutations(goatw, permlen) if sum(seq) == int(goats/courses)]
if not result:
goats += 1
permlen += 1
else:
break
print(result)
Я использую перестановки для этой задачи просто потому, что не знаю другого способа ее решения. В настоящее время из результата я получаю только решения, которые не соответствуют правилам (для данного примера). Я получаю решение (30, 7, 4); (26, 10, 5)
изнутри, однако, нет даже результатов с курсом, в котором количество коз отличается от 3, все курсы с 3 козами.
Мой вывод для данного примера (6 коз, 2 курса, ш: 26,7,10,30,5,4):
[(30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30), (30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30), (30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30), (30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30), (30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30), (30, 7, 4), (30, 4, 7), (26, 10, 5), (26, 5, 10), (10, 26, 5), (10, 5, 26), (7, 30, 4), (7, 4, 30), (5, 26, 10), (5, 10, 26), (4, 30, 7), (4, 7, 30)]
Я новичок в этом, и я также получил пример использования перестановок из Интернета. Где мой код не так? Я знаю, что могу просто сделать функцию, чтобы проверить, соответствуют ли мои результаты правилам, и если нет, исправить результаты, но я не знаю, как это сделать. Любая помощь будет оценена.