动态规划总结

原创 2016年05月31日 22:34:32


动态规划,在多阶段问题的解决中,最重要的就是注意前一种状况,对于当前状态的影响。像最长上升子序列问题等,这些比较典型的题目,应该认真学习掌握。

对于0-1背包问题,普通的0-1背包,题目比较典型。就是对于N件物品,以及容量为V的背包,放入的物品费用为c[i],价值为W[i],求解装入背包物品的价值最大。

思路很明确,N件物品,可以放也可以不放,设置一个二维数组,状态方程套模板即可,f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。这里要注意的是,for循环第二次循环要由大到小。

完全背包,是在0-1背包的基础上,每件物品的数量为无限。简单优化:若两件物品i、j满足c[i]<=c[j],并且w[i]>=w[j],则将物品j去掉,不用考虑。

将费用大于V的物品去掉,转化为0-1背包:考虑到第i种物品最多选V/c[i]件,于是可以把第i种物品转化为V/c[i]件费用及价值均不变的物品,然后求解这个0-1背包问题。

模板为:for i=1..N

             for v=0..V

                    f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0=<k<=V/c[i]}

多重背包,对每种物品的数量有一定限制。掌握了0-1背包,及完全背包,多重背包就是在两者的基础上的改变。

分组背包,有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

其状态方程为:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k} ,f[k][v]表示前k组物品花费费用v能取得的最大权值 。

在动态规划的问题上,就问题而言,都有比较典型的模板,不过在实际解决中,还是应多练习,很多与背包问题,等看似无关的题目,其实深入分析之后,完全可以转化为背包,模板套用,代码并不困难。

 


acm动态规划总结

  • 2012年03月05日 21:21
  • 388KB
  • 下载

数据结构动态规划算法总结

  • 2011年07月03日 19:51
  • 218KB
  • 下载

动态规划、贪心、回溯、分支限界法解0-1背包问题总结

本文通过0-1背包问题的不同解法,深入理解计算机常用算法动态规划、贪心、回溯、分支限界法的思想。 问题描述 0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值是vi,背包的容量为C。问...

动态规划总结-by Amber.doc

  • 2007年09月05日 18:39
  • 95KB
  • 下载

动态规划问题解题思路和总结

  • 2017年04月12日 14:45
  • 1021KB
  • 下载

LeetCode总结,动态规划问题小结

一,参考一般书籍中的“动态规划”讲解 1、基本概念 动态规划(Dynamic Programming)对于子问题重叠的情况特别有效,因为它将子问题的解保存在表格中,当需要某个子问题的解时,直接取值即...

算法动态规划总结(基础篇)

  • 2012年01月01日 13:56
  • 474KB
  • 下载

动态规划总结

  • 2007年11月13日 11:41
  • 138KB
  • 下载

动态规划的简要总结和四个经典问题的c++实现

本文给出了动态规划的简要定义、适用场景、算法实现。并给出了四种经典动态规划:钢条切割求最大收益问题、矩阵链相乘求最小乘法次数问题、最长公共子序列问题、求最小的搜索代价的最优二叉搜索树的c++代码实现。...

NOIP算法总结——关于简单 线性动态规划

动态规划,显然是一个很让人头疼的地方,也没有个固定的算法,最多就是有一些模板(比如背包啊),要是想要增大做出来的机率,也就只好多做做题找找感觉了~线性动态规划可以说是DP中最简单的类型了,当然里面很多...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划总结
举报原因:
原因补充:

(最多只允许输入30个字)