背包问题的三个解决方案

0-1背包的穷举解法.对于8个物品的调用了函数85次.

def MaxVal(contains,i,w,v):#four arg means the aviable space of container,the ith item to choose,and w and v means input of weights and values
    global callnums
    callnums += 1
    if(i == 0):
        return 0 if(contains < w[i]) else v[i]
    without_i = MaxVal(contains,i-1,w,v)
    if(contains < w[i]):
        return without_i
    else:
        with_i = v[i]+MaxVal(contains-w[i],i-1,w,v)
        return max(without_i,with_i)

动态规划版本:

def FastMaxVal(contains,i,w,v,memo):#memo is a dict recording all the partial solution we have get
    global callnums
    callnums += 1
    if(i == 0):
        return 0 if(contains < w[i]) else v[i]
    if((contains,i) in memo):return memo[(contains,i)]
    without_i= FastMaxVal(contains,i-1,w,v,memo)
    if(contains < w[i]):
        memo[(contains,i)] = without_i
        return without_i
    else:
        with_i = v[i]+FastMaxVal(contains-w[i],i-1,w,v,memo)
        memo[(contains,i)] = max(with_i,without_i)
        return memo[(contains,i)]

def D_MaxVal(contains,i,w,v):
    return FastMaxVal(contains,i,w,v,{})

非递归版本

def Best_Maxval(contains,n,w,v,memo):
    assert(len(w)==len(v))
    global infinity
    for c in range(0,contains+1):
        for i in range(0,n+1):
            if(i==0):memo[(c,0)] = 0 if(c<w[0])else v[0]
            else:
                without_i = memo[(c,i-1)] if((c,i-1) in memo) else 0
                with_i = v[i]+memo[(c-w[i],i-1)] if((c-w[i],i-1) in memo) else 0
                memo[(c,i)] = max(without_i,with_i)
    return memo[(contains,n)]

def MaxVal3(contains,n,w,v):
    return Best_Maxval(contains,n,w,v,{})

test

w = [1,5,3,4,1,5,3,4,1,5,3,4,1,5,3,4,1,5,3,4,1,5,3,4,1,5,3,4]
w = w[0:23]
v = [15,10,9,5,15,10,9,5,15,10,9,5,15,10,9,5,15,10,9,5,15,10,9,5,15,10]
v = v[0:23]
start = time.clock()
callnums = 0
maxval = MaxVal3(95,len(w)-1,w,v)
end = time.clock()
print(maxval,'time:%d'%(end-start))


start = time.clock()
callnums = 0
maxval = D_MaxVal(95,len(w)-1,w,v)
end = time.clock()
print(maxval,'time:%d'%(end-start))

start = time.clock()
callnums = 0
maxval = MaxVal(95,len(w)-1,w,v)
end = time.clock()
print(maxval,'time:%d'%(end-start))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划是一种将大问题分解为小问题进行解决的方法,背包问题是动态规划中最经典的题型之一。背包问题分为三类:01背包、完全背包和多重背包。其中,01背包问题是最经典的背包问题,也是动态规划的入门级必学算法。\[1\] 动态规划解决背包问题的核心思想是将问题分解为若干个小问题,先求解子问题,然后从子问题的解得到原问题的解。与分治法不同的是,动态规划适用于有重叠子问题的情况,即下一阶段的求解是建立在上一阶段的解的基础上进行进一步求解。通过填表的方式,逐步推进,最终得到最优解。\[2\] 多重背包问题介于01背包和完全背包之间,可以将其转化为01背包或完全背包问题来求解。对于某种物品,如果其数量乘以单位体积大于背包总容量,那么该物品与背包之间是完全背包问题。而对于某种物品,可以将其数量视为不同的物品,然后按照01背包问题进行处理。这样的转化可以在数据范围较小时适用,但在数量较大时可能会导致超时。因此,可以采用更精炼的划分方案,如二进制拆分,来减少物品分类的组数,从而优化算法的效率。\[3\] 总结来说,动态规划是一种解决背包问题的有效方法,通过将大问题分解为小问题,并利用子问题的解来求解原问题,可以得到背包的最优解。 #### 引用[.reference_title] - *1* *3* [【算法与数据结构】—— 动态规划之背包问题](https://blog.csdn.net/the_ZED/article/details/104882665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [动态规划算法解决经典背包问题](https://blog.csdn.net/m0_52110974/article/details/120122061)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值