有4个物品,重量是[1,4,6,4], 价值是[3,4,10,10], 背包容量是8, 限制最多只能取出2个物品,问最大的价值? 使用记忆化搜索。
def jiyihua(ws, vs, step , w, sel, table):
'''
:param ws: 物品的重量表
:param vs: 物品的价值表
:param step: 考虑第step个物品到最后一个物品, 物品的编号从0开始!
:param w: 容量是w
:param sel: 可选物品数量
:param table: 记忆化的表格
:return: 在以上情况下获得的最大价值
'''
key = f'{step},{sel},{w}'
if key in table:
return table[key]
if step==len(ws) or sel==0:
return 0
if w-ws[step]>=0:
table[key] = max(jiyihua(ws,vs,step+1,w,sel,table), jiyihua(ws,vs,step+1,w-ws[step],sel-1,table)+vs[step])
else:
table[key] = jiyihua(ws,vs,step+1,w,sel,table)
return table[key]
if __name__ == '__main__':
weights = [1,4,6,4]
values = [3,4,10,10]
step = 0
# 最多选择2个物品
selected = 2
# 背包容量是8
w = 8
table = {}
print(jiyihua(weights, values, step, w, selected, table))
print(table)