你好我们正在尝试为python中的优化问题编写代码,问题是我需要治疗一个人用药,药物1治愈25个单位需要3个药草A和2个药草B和药物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))
有人能帮我吗。谢谢
您从knapsack()
函数返回不一致的值,esp line:
return knapsack
导致你出现问题,因为这会返回可调用但你想要整数值作为更多行(递归调用)
return (med1[0]+knapsack(health+med1[0],med1,med2,x-3,y-2))
然后变成(你有太多括号btw):
return int + callable
然后你的代码失败了。所以这可能是不完整的代码,或者你从没有阅读的地方复制粘贴它。
你的主要问题是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))