一、动态规划
1.1 利用回溯算法求解 0-1 背包问题
背包问题(Knapsack problem)是一种组合优化的NP完全问题,给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高
代码(动态规划的思想)
import numpy as np
weight=[2,2,6,5,4]
value=[3,6,5,4,6]
weight_most=10
def bag_0_1(weight,value,weight_most):#return max value
num = len(weight)
weight.insert(0,0)#前0件要用
value.insert(0,0)#前0件要用
bag=np.zeros((num+1,weight_most+1),dtype=np.int32)#下标从零开始
for i in range(1,num+1):
for j in range(1,weight_most+1):
if weight[i]<=j:
# 如果还能装的下第j件的话
bag[i][j]=max(bag[i-1][j-weight[i]]+value[i],bag[i-1][j])
else:
# 装不下了 就不装呗
bag[i][j]=bag[i-1][j]
# print(bag)
return bag[-1,-1],bag
result,bag=bag_0_1(weight,value,weight_most)
print(result,'\n',bag)
'''
15
[[ 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 3 3 3 3 3 3 3 3 3]
[ 0 0 6 6 9 9 9 9 9 9 9]
[ 0 0 6 6 9 9 9 9 11 11 14]
[ 0 0 6 6 9 9 9 10 11 13 14]
[ 0 0 6 6 9 9 12 12 15 15 15]]
'''