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

动态规划 之背包问题(九讲)[通俗易懂]背包九讲参考:"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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • shell数组与awk数组

    shell数组与awk数组1.whilereadlinedo hosts[i++]=$linedone</etc/hosts#遍历foriin${!hosts[@]}do echo”hosts数组的索引:$i,索引对应的值:${hosts[$i]}”done1.数组值的自增[root@manager/tmp/sh/2020-12-09_题]#declare-Aip#声明一个数组ip[root@manager/tmp/sh/2020-12-09_题]#echo

    2022年7月19日
    17
  • HandlerSocket的安装实例及性能测试[通俗易懂]

    HandlerSocket的安装实例及性能测试[通俗易懂] 一HandlerSocket简介Hanldersocket是一个MySQL守护进程插件,它让应用程序可以将MySQL当NoSQL使,Hanldersocket的主要目的是与存储引擎,如InnoDB交互,而不需要SQL相关的开销。访问MySQL表时,Hanldersocket仍然需要打开和关闭表,但不是每次访问都要求打开和关闭,因此减少了互斥争夺,极大地提高了系统性能,当流量变小时,Ha…

    2022年8月24日
    8
  • 常量字符串过长的解决办法_jdbc编译异常

    常量字符串过长的解决办法_jdbc编译异常如果使用String str = “这是一个很长很长很长 你需要的字符串。”; 出现异常不能正常编译运行时,可以使用下方:StringBuilder sb = new StringBuilder();sb.append(“这是一个很长很长”);sb.append(“很长 你需要的字符串”);字符串太长或字符串其他情况下可使用 : StringBuilder sb = new StringBuilder()…

    2022年8月20日
    6
  • 最全的sublime插件整理

    最全的sublime插件整理PackageControl1.插件管理器1)在Sublime中打开View–>ShowConsole,将以下代码复制到输入框中后按回车键 importurllib.request,os;pf=’PackageControl.sublime-package’;ipp=sublime.installed_packages_path();urllib.request.i

    2022年6月24日
    67
  • 单核苷酸多态性(SNP)_单核苷酸多态性分析

    单核苷酸多态性(SNP)_单核苷酸多态性分析定义主要指基因组水平上由单个核苷酸的变异所引起的DNA序列多态性。在基因组水平上由单个核苷酸的变异所引起的DNA"序列多态性"。即:在不同个体的同一条染色体或同一位点的

    2022年8月4日
    5
  • linux vim复制粘贴命令_在Linux如何复制

    linux vim复制粘贴命令_在Linux如何复制将光标移动到复制的起始位置,按一下大写V或小写v,(大写V是整行,小写是光标处),然后上下左右将光标移动到复制的末尾,然后按下y,移动到要粘贴的位置,按下大写P或小写p(大写P:光标之前粘贴,小写p光标之后粘贴);总结:光标处起始处——按V/v——移动到复制的末尾处——按y——光标移到想粘贴的地方——按P/p;想要剪切的话,把y换成dd;…

    2022年9月22日
    2

发表回复

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

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