01背包问题(动态规划)

本文介绍了01背包问题,讨论如何选择n种物品放入容量为c的背包中,使得物品总价值最大化。通过动态规划分析,得出状态转移方程,并给出代码实现。还提及了背包问题的扩展,考虑了背包容积的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包容量是c,问应如何选择装入背包中的中的物品,使得装入物品的总价值最大?

问题分析:我们用m[i][j]表示i~n的物品放入容量为j的背包里可以取得的最大价值,cw表示当前背包容量。在判断一个物品是否可以被放入时,若cw比wi小,说明wi放不下了,此时m[i][j] = m[i+1][j],若cw比wi大,那么有可放可不放两种情况:(1):放入背包后能够达到最大价值,此时m[i][j] = m[i+1][j];(2):不是最佳选择,后面还有更好的选择,此时需要做一次对比,对比的两项分别是:m[i+1][j](不放这个物品能够达到的最大价值)和m[i+1][j-wi]+ vi(放这个物品能够达到的最大价值),两者取最大值就好了。经过以上分析我们可以得到一个函数表达式   :

m[n-1][j] = {
             m[n][j]                                j < w[n-1]
             max( m[n][j], m[n][j-w[n-1]]+v[n-1] )  j >= w[n-1]
             }

得到这个以后,如果我们知道m[n][j](j:0~n)我们就可以不断地向后推导得到m[1][c]的值,经过分析其实我们发现m[n][j]的之其实很好算,如果wn大于j就为0,小于就为vn,那么可以得到以下表达式:

m[n][j] = {
           vn        j >= wn
           0         j < wn
           }

根据函数式就可以写代码了:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值