0/1背包问题

来源:互联网 发布:购买网络电视 编辑:程序博客网 时间:2024/05/16 15:27

定义状态: 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]=0for i in range(T+1):f[0][i]=0for 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=Tfor i in range(n,0,-1):if f[i][j]>f[i-1][j]:select[i]=1j-=w[i]print("最大价值: "+str(f[n][T]))print("最优选择序列:",end=' ')for each in range(1,n+1):print(select[each],end=' ')return f#testT=6w = [0, 2, 3, 4]v = [0, 1, 2, 5]n=len(w)-1Knapsack_01(T,w,v,n)