Итак, я должен решить задачу о рюкзаке для класса. Пока что я придумал следующее. Мои компараторы - это функции, которые определяют, какой из двух предметов будет лучшим вариантом (путем просмотра соответствующих кортежей (значение, работа)).
Я решил перебрать возможные предметы с помощью работы меньше, чем maxWork, и, чтобы найти, какой предмет является лучшим вариантом на любом конкретном этапе, я сравнил свой последний предмет со всеми другими предметами, которые мы еще не использовали.
def greedyAdvisor(subjects, maxWork, comparator):
"""
Returns a dictionary mapping subject name to (value, work) which includes
subjects selected by the algorithm, such that the total work of subjects in
the dictionary is not greater than maxWork. The subjects are chosen using
a greedy algorithm. The subjects dictionary should not be mutated.
subjects: dictionary mapping subject name to (value, work)
maxWork: int >= 0
comparator: function taking two tuples and returning a bool
returns: dictionary mapping subject name to (value, work)
"""
optimal = {}
while maxWork > 0:
new_subjects = dict((k,v) for k,v in subjects.items() if v[1] < maxWork)
key_list = new_subjects.keys()
for name in new_subjects:
#create a truncated dictionary
new_subjects = dict((name, new_subjects.get(name)) for name in key_list)
key_list.remove(name)
#compare over the entire dictionary
if reduce(comparator,new_subjects.values())==True:
#insert this name into the optimal dictionary
optimal[name] = new_subjects[name]
#update maxWork
maxWork = maxWork - subjects[name][1]
#and restart the while loop with maxWork updated
break
return optimal
Проблема в том, что я не знаю, почему это неправильно. Я получаю ошибки, и я понятия не имею, где мой код неправильный (даже после добавления операторов печати). Помощь будет очень признательна, спасибо!