背包容量为9,在背包可承受范围内,携带价值更高的物品。并列出背那些物品
物品重量 | 价值 |
---|---|
2 | 5 |
4 | 4 |
5 | 6 |
3 | 2 |
class solution():
def __init__(self, w, v, num):
self.res_table = [[0 for i in range(num + 1)] for i in range(len(w) + 1)]
self.w = w
self.v = v
self.num = num
self.res = []
def solve(self):
for i in range(1, len(self.res_table)):
for j in range(len(self.res_table[0])):
if j >= self.w[i - 1]:
self.res_table[i][j] = max(self.res_table[i - 1][j],
self.res_table[i - 1][j - self.w[i - 1]] + self.v[i - 1])
else:
self.res_table[i][j] = self.res_table[i - 1][j]
return self.res_table[len(self.w)][self.num]
def res_choice(self):
"""
回溯算法
:return:返回背包内容,用数组体现,0代表没有装,1代表装了
"""
res = self.res_table[len(self.w)][self.num]
for i in range(len(self.res_table)):
for j in range(len(self.res_table[0])):
if self.res_table[i][j]==res:
self.fun(i,j,res,[0 for i in range(len(w))])
return self.res
def fun(self,i,j,num,res):
if self.v[i-1] == num:# 结束条件
res[i-1] = 1
if res not in self.res:
self.res.append(res)
return
if num == self.res_table[i - 1][j]: # 第一种情况
temp_res = res.copy()
self.fun(i-1,j,num,temp_res)
if num == self.res_table[i - 1][j - self.w[i - 1]] + self.v[i - 1]:# 第二种情况
temp_res = res.copy()
temp_res[i-1] = 1
self.fun(i-1,j - self.w[i - 1],num-self.v[i - 1],temp_res)
if __name__ == '__main__':
w = [2, 4, 5, 3]
v = [5, 4, 6, 2]
num = 9
my_solution = solution(w, v, num)
print(my_solution.solve())
print(my_solution.res_choice())
<<<
11
[[1, 0, 1, 0], [1, 1, 0, 1]]