01背包

     01背包问题:假设有一个背包的容量为V,现有n件物品,每件物品的体积为v1,v2,。。。vn,与之对应的价值为p1,p2,。。。pn。问,如何选择物品,使得所装入背包中的物体的价值总和最大?
   解题思路:每个物体可以选择放或不放进背包,那么n件物体共有2的n次方种方案。所以最直接的方法就是搜索,其时间复杂度为O(2^n).
  

   最常用的方法是动态规划法来求背包问题。其思路是这样的:

   用dp[i][v]表示前i件物体在背包容量为v的情况下装入物体的最大价值。那么在考虑第i件物品时,可以选择装入或不装入。则其状态转移方程为:
                dp[i][v]=max{dp[i-1][v],dp[i-1][v-vi]+pi}
该状态转移方程中,{dp[i-1][v]表示第i件物体不装入背包中,,dp[i-1][v-vi]+pi表示第i件物体装入背包中。 
 

   空间优化,将二维数组优化为一位数组dp[v],需要注意的是,必须将v递减的方式进行遍历。

    初始化要分两种情况:
  (1)若背包必须装满。则可初始化如下:
            dp[0]=0,dp[1...V]=-∞。表示当容积为0时,只接受一个容积为0的物品入包。
   (2)若背包可以空下。则初始化如下:

            dp[0...V]=0.表示任意容积的背包都有一个有效解即为0

   举例如下图:


  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值