python解答背包问题

一、问题描述

给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。例如:有五个物品重量为: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]

最后一行显示的就是我们最终要拿的是第一个、第二个和第五个

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值