定义状态: f(i,j) 为 前i件物品占用j容量时的最大价值,得到状态转移方程为:
#w[i]为第i件物品的重量,v[i]为第i件物品的价值
if w[i]<=j: #放得进
f(i,j)=max{f(i-1,j),f(i-1,j-w[i])+v[i]}
else: #放不进
f(i,j)=f(i-1,j)
def Knapsack_01(T,w,v,n):
f=[[0 for col in range(T+1)]for row in range(n+1)]
#边界设置
for i in range(n+1):
f[i][0]=0
for i in range(T+1):
f[0][i]=0
for i in range(1,n+1):
for j in range(1,T+1):
if w[i]<=j:
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])
else:
f[i][j]=f[i-1][j]
#由f推导选择序列
select=[0 for i in range(n+1)]
j=T
for i in range(n,0,-1):
if f[i][j]>f[i-1][j]:
select[i]=1
j-=w[i]
print("最大价值: "+str(f[n][T]))
print("最优选择序列:",end=' ')
for each in range(1,n+1):
print(select[each],end=' ')
return f
#test
T=6
w = [0, 2, 3, 4]
v = [0, 1, 2, 5]
n=len(w)-1
Knapsack_01(T,w,v,n)