01背包问题 Python
这个问题看到大多数是C++解决的,思想相同,代码大同小异
所以把Python的代码写下来了
1、动态规划
Python实现代码
##动态规划解决01背包问题
##递归
things=['a','b','c','d','e']
value=[6,3,5,4,6]
weight=[2,2,6,5,4]
def backpack(n,w):##从n件物品中选,背包可用价值空间为w
if (n==0) or (w==0):##物品没有了,或背包可用价值没有了,直接停止
return 0
if w<weight[5-n]:##如果背包可用价值比物品的价值小,则直接不放入
ret=backpack(n-1,w)##不放入
return ret
val1=backpack(n-1,w-weight[5-n])+value[5-n]##放入背包
val2=backpack(n-1,w)##不放入
##ret存放最大价值
if val1>=val2:
ret=val1
else:
ret=val2
return ret
if __name__ =='__main__':
ret=backpack(5,10)
print("最大价值:"+str(ret))
2.回溯
Python实现代码
##回溯算法解决01背包问题
bestV = 0 # 装入的价值
curW = 0 # 当前放入背包的物品重量
curV = 0 # 当前放入背包的物品价值
bestx = None # 标记装入的物品,置为ture
def backtrack(i):
global bestV, curW, curV, x, bestx # global 修改外部变量的值
if i >= n: # 递归结束
if bestV < curV: # bestV赋值为最大价值
bestV = curV
bestx = x[:] #给bestx赋值
else:
# 两种情况,该物品放入、不放入
if curW + w[i] <= c: # 放入物品
x[i] = True
curW = curW + w[i]
curV = curV + v[i]
backtrack(i + 1)
curW = curW - w[i] # 不放入
curV = curV - v[i]
x[i] = False # 不放入物品
backtrack(i + 1)
if __name__ == '__main__':
n = 5 # 物品数量
c = 10 # 背包容量
w = [2, 2, 6, 5, 4] # 物品重量
v = [6, 3, 5, 4, 6] # 物品价值
x = [False for i in range(n)] # 初始化x
# print(x)
backtrack(0)
print("最大价值:" + str(bestV))
#print(bestV) # 输出最大价值
#print(bestx) # 输出最大价值装入的物品