这里就不讲具体的思路了,个人觉得这个博客讲的很清楚了:https://blog.youkuaiyun.com/w113691/article/details/81743201
在解决问题的时候,我搞不清楚为什么有的地方要加1,所以自己试着按自己的理解重新写了一下,运行成功!
1.定义一个bag函数,记录初始value列表,记录在依次放入物品的时候,在不同的重量限制下的总价值。这里之所以是c+1是因为从0到10的重量有0,1,2,3,4,5,6,7,8,9,10一共11个数字,所以要留出11个位置。n是因为把物品记为0,1,2,3,4,5共6个数字,只需要6个位置。这样就生成了一个6*11的所有值都为0的列表(我不知道这样表达准不准确……)。然后从第0个物品开始,令容量为1(0就不考虑了),看是否应该放入这个物品,然后考虑容量2,3……10,再考虑第1个物品,同样看是否放入。最后返回value值。
def bag(n,c,w,v):
value =[[0 for j in range(c+1)]for i in range(n)]#背包的重量从0到c,物品从0到n-1
print(value)
for i in range(0,n):#i表示第i个物品,我们把第1个物品看作第0个
for j in range(1,c+1):#j表示重量为j,从重量为1开始算
if j < w[i] :#背包容量不够,放不下第i个物品
value[i][j] = value[i-1][j]#value表示总价值,不放这个物品,肯定就保留前一个物品的总价值
elif j >= w[i] :
if value[i][j] < value[i-1][j-w[i]]+v[i]:#背包容量足够,价值提升
value[i][j] = value[i-1][j-w[i]]+v[i]
else: value[i][j] = value[i-1][j]#背包容量足够,但是价值没有提升
for x in value:
print(x)
return value
2.回溯,看是否选择了第i个物品。如放入了就把该处的False改成True。注意这里我在输出第几个物品的时候用的是i+1,这也是为了理解方便,免得输出第0个物品不知道是哪一个……
def show(n,c,w,value):
print('max value',value[n-1][c])
x = [False for i in range(n)]
j = c
for i in range(n-1,0,-1):
if value[i][j] > value[i-1][j]:#i代表第i个物品,如果放入第i个物品的价值大于同等重量放入i-1物品的重量,说明选择了物品i
x[i]=True
j -= w[i]
print('items:')
for i in range(n):
if x[i]:
print('no.',i+1,' ')
3.输入数据,产生结果。
if __name__ =='__main__':
n = 6
c = 10
w = [2, 2, 3, 1, 5, 2]
v = [2, 3, 1, 5, 4, 3]
value = bag(n,c,w,v)
show(n,c,w,value)
4.结果展示
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
[0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[0, 0, 3, 3, 5, 5, 5, 5, 5, 5, 5]
[0, 0, 3, 1, 1, 4, 4, 6, 6, 6, 6]
[0, 5, 5, 8, 6, 6, 9, 9, 11, 11, 11]
[0, 5, 5, 8, 6, 4, 9, 9, 12, 10, 10]
[0, 5, 3, 8, 8, 11, 9, 7, 12, 12, 15]
max value 15
items:
no. 2
no. 4
no. 5
no. 6
Process finished with exit code 0
参考文献:https://blog.youkuaiyun.com/w113691/article/details/81743201
https://blog.youkuaiyun.com/qq_34178562/article/details/79959380
https://blog.youkuaiyun.com/littlethunder/article/details/26575417