【动态规划】背包问题{更新中}

 

0-1背包问题

背包问题的产生:鱼与熊掌不可兼得的问题。比如一个软件的功能丰富了,但同样其运行时占用资源和静态软件包的体量也上去了。如何做到有限的资源,价值最大化。

0-1背包问题:对于一堆价值为v_{i},重量为w_{i}的物品 :[ (w_{1},v_{1}),(w_{2},v_{2}),(w_{3},v_{3}),...(w_{n},v_{n})],和一个总承重 w 的背包。如何取舍使得背包总价值最大化。每个物品要么加一件要么不加。

解决方案1:计算性价比 q_{i} = v_{i}/w_{i},按排序放入。

缺点:举反例,有一堆按性价比排序后的物品: [ (5,10),(4,7),(2,3.5),(2,1)],背包承重 6。给出的答案是物品1。但是物品2加上物品3的价值是最大的,所以上述方案不满足要求。但注意到,如果背包承重 5 ,那么给出的答案就是对的。

解决方案2:考虑分解问题,注意到当物品数量很少,或者背包承重很小时,很容易得出最优解(只能放的下特定物品)。这个思路中有两个变量很小,物品数量 \small i ,承重 w。因此我们假设对于前 \small i 个物品,和一个总承重 w 的背包,最优解是B[i][w] = v_{max}。那么对于前 (i+1) 个物品,和一个总承重 w 的背包,有以下两个情况

  • 最优解中不包含这个物品:等于背包 w 承重不变 ,只有前 i 个物品的最优解 B[i][w]
  • 最优解中包含这个物品:等于对于前 i 个物品,承重至多为w-w_{i}的包的价值最优解 B[i][w-w_{i}],以此为基础,又放入了这个物品,得到 B[i][w-w_{i}]+v_{i}(因为前者如果不是最优,我可以找到一个比前者更优的解作为 B[i][w-w_{i}],然后加入这个物品,得到更优的解,与情况描述矛盾)。

比较两者优劣后,即可得最优解等式: B[i+1][w] =max(B[i][w] ,B[i][w-w_{i}]+v_{i})

 

完全背包问题

完全背包问题的产生:可以认为是数学上对 0-1 问题的拓展。

完全背包问题:物品数量无限,可以不加,也可以加 n 次。

解决方案:思路和 0-1 背包问题是一样的,对于前 (i+1) 个物品,和一个总承重 w 的背包,有以下 k 种情况:

  • 最优解中不包含这个物品:等于背包 w 承重不变 ,只有前 i 个物品的最优解。
  • 最优解中包含 1 个物品:等于对于前 i 个物品,承重至多为w-w_{i}的包的价值最优解,加入了 1 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
  • 最优解中包含 2 个物品:等于对于前 i 个物品,承重至多为w-2*w_{i}的包的价值最优解,加入了 2 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
  • 最优解中包含 3 个物品:等于对于前 i 个物品,承重至多为w-3*w_{i}的包的价值最优解,加入了3 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
  • 。。。。
  • 最优解中包含 k 个物品:等于对于前 i 个物品,承重至多为w-k*w_{i}的包的价值最优解,加入了 k 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。

此时,k 满足方程组 \left\{ \begin{array}{l} 0\leq w-k*w_{i} \\ 0\geq w-(k+1)*w_{i} \end{array} \right.。可得递推最优解:B[i+1][w] =max(B[i][w-t*w_{i}]+t*v_{i}) ,0\leq t \leq k

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值