0-1背包问题:
如果给定一个集合s={1,2,3…,n},物品i的重量是w(i),其价值是v(i),背包的容量为W,即在最大载重量不超过W。在限定的总重量W内,如何选择物品使得物品的总价值最大?这类问题就是背包问题
解决方法:
我们先来做个整理,比如有4个数a1,a2,a3,a4,我们要找出4个数里面在不超过重量的情况下,价值最大。进一步在分析对于这个数合适我就装,不合适我就不要装,这样最后一个数a4情况下有这4种情况并满足下列等式:
提示:拿出笔记本记下下面公式
p(i,j)有两种情况是这个物品 i 放和不放的情况,
如果不放,则满足p(i,j)=p(i+1,j)此时 0<=j<w(i);
当放的时候,则满足p(i,j)=max( p(i+1,j) , p(i+1,j-w(i))+v(i) ) 此时 j>=w(i)
在j>=w(n)情况下 , p(n,j) = v(n)
在0<=j<w(n)情况下,p(n,j) = 0
在这个公式中p(i,j)就是背包容量为 j,可选物品为 i,
p(n,j)就是 n 这个物品的价值装不下就是 0,装得下就是v(n)
算法实现:(Python)
def beibao(lis1,lis2,n):
# 重量w 2 1 3 2
# 价值v 12 10 20 15
# 背包容量为5 上面是4个物品
lis=[[0 for i in range(n+1) ]for j in range(len(lis1))]
for i in range(len(lis1)):
for j in range(1,n+1):
if i ==0:
if j>=lis1[i]:
lis[i][j]=lis2[i]
else:
if j < lis1[i]:
lis[i][j]=lis[i-1][j]
else:
lis[i][j]=max([lis2[i],lis[i-1][j-lis1[i]]+lis2[i],lis[i-1][j]])
return lis
print(beibao([2,3,1,2],[15,20,10,12],5))
人生苦短,我用python。