动态规划 之背包问题(九讲)[通俗易懂]

动态规划 之背包问题(九讲)[通俗易懂]背包九讲参考:"AcWing题库"参考书目:"背包九讲"1、01背包问题题目描述:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i

大家好,又见面了,我是你们的朋友全栈君。

背包九讲

动态规划 之背包问题(九讲)[通俗易懂]

参考:AcWing题库

参考书目:背包九讲

1、01背包问题

  • 题目描述:有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。第 i件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。

  • 思路:动态规划,对于每一件物品遍历背包容量,当背包可容纳值大于等于当前物品,与之前已放进去的物品所得价值进行对比,考虑把是否需要置换。

    • 状态转移方程:定义dp[i][j]:前i个物品,背包容量j下的最优解
      -(1)当前背包容量不够,为前\(i-1\)个物品最优解:j<w[i]时,有dp[i][j]=dp[i-1][j]
      -(2)当前背包容量够,判断选还是不选第i个物品:j>=w[i]时,选该物品->dp[i][j]=dp[i-1][j-w[i]]+v[i];不选该物品->dp[i][j]=dp[i-1][j]
## 伪代码:
# for i=1..N
#   for v=V..0
#       f[v]=max{f[v],f[v-c[i]]+w[i]}; 
  • \(\color{red}{代码实现-github}\)0-1背包

2、完全背包问题

  • 题目描述:有 N 种物品和一个容量是 V的背包,每种物品都有无限件可用。第 i种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

  • 思路:

    • 思路1:最简单的想法,就是将完全背包转化为0-1背包问题,可以将第 i 种物品转化为W/w[i]件费用及价值均不变的物品,然后求解0-1背包问题。

    • 思路2:更高效的转化方法是第 i 种物品拆成费用为w[i]2k,价值为v[i]*2k的若干件物品,其中k满足w[i]2^k<=W。因为不管最优策略 选几件第 i 种物品,总可以表示成若干个 2^k 件物品的和(二进制思想)

    • 思路3(完全背包优化):若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。c表物品重量,w表示对应物品价值。即将重量大且价值低的物品去掉。

    • 思路4(复杂度为O(VN)): 0-1背包问题中要按照 w=W..0 的逆序来循环,而完全背包必须按照从小到大的顺序。这是因为 要保证第 i 次循环中的状态 f[i][w]是由状态 f[i-1][w-w[i]]递推而来。换句话 说,这正是为了保证每件物品只选一次,保证在考虑“选入第 i 件物品”这件策 略时,依据的是一个绝无已经选入第 i 件物品的子结果 f[i-1][w-w[i]]。而现 在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第 i 种物 品”这种策略时,却正需要一个可能已选入第 i 种物品的子结果 f[i][w-w[i]], 所以就可以并且必须采用 w=0..W 的顺序循环。

## 伪代码:
# for i=1...N
#   for w=0...W
#       f[w] = max(f[w], f[w-cost]+weight)

3、多重背包问题

4、混合背包问题

5、二维费用的背包问题

6、分组背包问题

7、背包问题求方案数

8、求背包问题的方案

9、有依赖的背包问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154257.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构JAVA—递归算法「建议收藏」

    数据结构JAVA—递归算法「建议收藏」http://blog.csdn.net/wangjinyu501/article/details/8248492  原版一、基本概念       递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决

    2022年7月8日
    18
  • 备忘录模式实例_iphone语音备忘录无法分享

    备忘录模式实例_iphone语音备忘录无法分享备忘录模式 Motivation动机模式定义实例结构要点总结笔记动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯对象之前处于某个点时的状态.如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节.如何实现对象状态的良好保存与回复?但同时又不会因此而破坏对象的封装性模式定义在不破坏封装性的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态实例朴素class Memento{ stri

    2022年8月11日
    4
  • tasklist命令参数应用详细图解

    tasklist命令参数应用详细图解一操作实例不带参数;/svc参数;/SVC 显示每个进程中的服务信息,当/fo参数设置为table时有效。列出调用了某个dll的进程;列出系统中正在运行的非“SYSTEM“状态的所有进程。查看远程主机进程列表;需要远程主机的RPC服务支持;/v列出

    2022年6月5日
    31
  • NOIP 2011 计算系数

    NOIP 2011 计算系数数论

    2022年9月2日
    7
  • jediscluster 关闭 连接池_Redis——JedisCluster

    jediscluster 关闭 连接池_Redis——JedisClustersmart客户端实现原理(追求性能,不使用代理)从集群中选一个可运行节点,使用clusterslots初始化槽和节点映射。将clusterslots的结果映射到本地,为每个节点创建JedisPool。执行命令执行命令执行命令的过程简单来说,就是通过CRC16计算出key的槽,根据节点映射直接访问目标节点,如果出错,就随机挑选一个节点,通过moved重定向访问目标节点,并且重新初始化节点映射。好…

    2022年10月10日
    2
  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]

    课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]基于51单片机的智能小车,可以实现循迹、避障、APP控制等功能;顺便提了一下自己大学的“造车”史!

    2022年10月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号