TypeError int和funcs

问题描述 投票:-2回答:2

你好我们正在尝试为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))

有人能帮我吗。谢谢

python optimization typeerror knapsack-problem
2个回答
0
投票

您从knapsack()函数返回不一致的值,esp line:

return knapsack

导致你出现问题,因为这会返回可调用但你想要整数值作为更多行(递归调用)

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

然后变成(你有太多括号btw):

return int + callable

然后你的代码失败了。所以这可能是不完整的代码,或者你从没有阅读的地方复制粘贴它。


0
投票

你的主要问题是return knapsack返回函数本身,而不是整数,这就是你得到TypeError的原因。如果我正确地阅读您的代码,您想要返回的是health的未更改值(因为您将不使用任何药物)。

这是一个更简单的方法,使用普通整数而不是med1med2的单元素列表,以及内置函数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))
© www.soinside.com 2019 - 2024. All rights reserved.