现在有3个物品,背包容量为10,欲求在有限的容量内装入的物品价值最大。
采用动态规划,当前物品取或不取分两种情况取最值,完成下表的填写:
维护动态数组dp[i][j]表示当前可以取前i个物品,在j的容量下可装入物品的最大价值量。
边界条件是只取第一个物品时的状态dp[0][j]。当背包容量j=0时,dp[i][0]=0。代码如下:
# -*- coding:utf-8 -*-
#背包问题
num=3#可装入物品的数量
money=10#背包最大容量(体积)
vol=[3,4,5]#num个物品各自的体积
val=[4,5,6]#num个物品各自的价值
def dp(money,vol,val):
res=[[0 for _ in range(money+1)] for _ in range(len(vol))]#初始化dp数组
for i in range(1,money+1):#边界条件
if i<vol[0]:
res[0][i]=0
else:
res[0][i]=val[0]
for i in range(1,len(vol)):#动态规划状态转移
for j in range(1,money+1):
res[i][j]=max(res[i-1][j],res[i-1][j-vol[i] if j>=vol[i] else 0]+val[i] if j>=vol[i] else 0 )
return res
print(dp(money,vol,val) )