TypeError int и funcs - PullRequest
       23

TypeError int и funcs

0 голосов
/ 18 апреля 2019

Привет, ребята. Я пытаюсь написать код для задачи оптимизации в python, проблема в том, что мне нужно вылечить человека с помощью медицины, лекарство 1 лечит 25 единиц, требуется 3 травы А и 2 травы Б, а лекарство 2 лечит 20 единиц, требуется 4 трава A и 1 трава BI имеют 25 единиц травы A и 10 единиц травы B. В конце я хочу напечатать максимальное количество здоровья, которое я могу излечить, и сколько из каждого лекарства 1 и 2, которое я использовал (ясно, что понятия не имел, как поставить)

Я пытался написать проблему с рюкзаком, но получаю сообщение об ошибке

TypeError: неподдерживаемые типы операндов для +: 'int' и 'function'

med1= 25
med2= 20
x=25
y=10
health=0
def knapsack(health,med1,med2,x,y):
    if x==0 or y==0:
        return knapsack
    if(med1+knapsack(health+med1,med1,med2,x-3,y- 
   2)>med2+knapsack(health+med2,med1,med2,x-4,y-1)):
        return (med1+knapsack(health+med1,med1,med2,x-3,y-2))
    else:
        return (med2+knapsack(health+med2,med1,med2,x-4,y-1))
print(knapsack(health,med1,med2,x,y))

Может кто-нибудь мне помочь. Спасибо

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Ваша главная проблема в том, что return knapsack возвращает саму функцию, а не целое число, поэтому вы получаете ошибку TypeError.То, что вы хотите вернуть, если я правильно читаю ваш код, это неизменное значение health (так как вы не будете использовать какое-либо лекарство).

Вот гораздо более простой способ сделать этос использованием простых целых чисел, а не одноэлементных списков для med1 и med2, и встроенной функции max () , которая возвращает большее из двух значений, переданных вэто:

def knapsack(health,med1,med2,x,y):
    if x <= 0 or y <= 0:
        return health
    return max(med1+knapsack(health+med1, med1, med2, x-3, y-2),
               med2+knapsack(health+med2, med1, med2, x-4, y-1))

print(knapsack(0, 25, 10, 25, 10))
0 голосов
/ 18 апреля 2019

Вы возвращаете противоречивые значения из вашей knapsack() функции, особенно в строке:

return knapsack

вызывает у вас проблемы, так как возвращает вызываемое, но вы хотите целочисленное значение как дальнейшие строки (рекурсивно вызывается) сделать

return (med1[0]+knapsack(health+med1[0],med1,med2,x-3,y-2))

, который затем превращается в (кстати, у вас слишком много скобок):

return int + callable

и тогда ваш код не работает. Так что это либо неполный код, либо вы копируете его откуда-то без чтения.

...