背包问题求解
一、问题描述
给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。例如:有五个物品重量为:2,2,6,5,4。他们的重量分别为:6,3,5,7,6。假设背包重量是10,此时我们最优的方式是拿第一个、第二个和第四个物品。总重量为9,总价值是16。
二、解题方法之暴力破解
思路:利用暴力破解思想获取背包能够容纳的所有的物品组合,计算出每个组合背包的价值,然后选取最大值。
代码如下:
import copy
def judge(all_ways,way ,num ,now_done):
#如果当前处理位置是最后一个
if num == now_done:
way.append(now_done)
if way != []:
all_ways.append(way)
return 0
elif now_done < num:
#选第now_done个
way.append(now_done)
if way != []:
all_ways.append(way)
new_way = copy.deepcopy(way)
judge(all_ways, new_way, num, now_done+1)
#不选第now_done个
way.pop()
new_way = copy.deepcopy(way)
judge(all_ways, new_way, num, now_done+1)
else:
return 0
def main(bag, weight, value):
all_ways = []
way = []
num = len(weight)
now_done = 1
judge(all_ways, way, num, now_done)
return all_ways
def getMaxValue(ret,value,weight,bag):
valueMax = 0
maxList = []
for i in ret:
valueNew = 0
weightNew = 0
for j in i:
valueNew += value[j-1]
weightNew += weight[j-1]
if valueNew > valueMax and weightNew <= bag:
valueMax = valueNew
maxList = i
return valueMax,maxList
if __name__ == '__main__':
bag = 10
weight = [2, 2, 6, 5, 4]
value = [6, 3, 5, 7, 6]
ret = main(bag, weight, value)
for _ in ret:
if _ == []:
ret.remove(_)
print("optimal solution is:%s"% str(ret))
value, maxList = getMaxValue(ret,value,weight,bag)
print(maxList)
结果显示:
optimal solution is:[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5], [1, 2, 3, 5], [1, 2], [1, 2, 4, 5], [1, 2, 5], [1], [1, 3], [1, 3, 4, 5], [1, 3, 5], [1], [1, 4, 5], [1, 5], [2], [2, 3], [2, 3, 4, 5], [2, 3, 5], [2], [2, 4, 5], [2, 5], [3], [3, 4, 5], [3, 5], [4, 5], [5]]
[1, 2, 5]
最后一行显示的就是我们最终要拿的是第一个、第二个和第五个