Python求解动态规划的第一个学习案例,记录一下,感谢阿里阿里小刘同学提供这么好的素材!!
import numpy as np
def fun(n,W,w,p):
#最优值数据初始化:a[i,j]刻画的是前i个物品,重量不超过j时的最优函数值
a=np.array([[0]*(W+1)]*(n+1))
#最优物品列表初始化:d[(i,j)]刻画的前i个物品,重量不超过j时的物品列表
d={}
for i in range(0,n+1):
for j in range(0,W+1):
d[(i,j)]=[]
#依次计算前i个行李,重量不超过j时的最大价值,并记录最优子物品集合
for i in range(1,n+1):
for j in range(1,W+1):
if w[i-1]>j:
a[i,j]=a[i-1,j]
d[(i,j)]=d[(i-1,j)]
elif p[i-1]+a[i-1,j-w[i-1]]>=a[i-1,j]:
a[i,j]=p[i-1]+a[i-1,j-w[i-1]]
d[(i,j)]=d[(i-1,j-w[i-1])]+[i-1]
else:
a[i,j]=a[i-1,j]
d[(i,j)]=d[(i-1,j)]
print(a)
#print最优值
print('max value is ',a[n,W])
#print最优物品集合
print('The optimal item set is: ',d[(n,W)])
weights=[1,2,5,6,7,9]
price=[1,6,18,22,28,36]
fun(len(weights),13,weights,price)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a0233c2ca92a1addb289cf73091088ce.png)