大家好,我正在尝试为python中的优化问题编写代码,问题是我需要医治一个人,Medicine1可以治愈25个单位,需要3种草药A和2个草药B,而Medicine2可以治愈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))
有人可以帮助我吗? 谢谢
答案 0 :(得分:0)
您正在从knapsack()
函数的返回值不一致,特别是在行中:
return knapsack
给您带来麻烦,因为它返回可调用的但您想要整数值 (进一步递归调用)
return (med1[0]+knapsack(health+med1[0],med1,med2,x-3,y-2))
然后变成了(顺便说一句,您有太多的括号):
return int + callable
,然后您的代码失败。因此,这要么是不完整的代码,要么是从没有阅读的地方复制粘贴。
答案 1 :(得分:0)
您的主要问题是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))