动态规划总结

原创 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动态规划总结

  • 2013-11-29 17:56
  • 538KB
  • 下载

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

动态规划,显然是一个很让人头疼的地方,也没有个固定的算法,最多就是有一些模板(比如背包啊),要是想要增大做出来的机率,也就只好多做做题找找感觉了~线性动态规划可以说是DP中最简单的类型了,当然里面很多...

acm动态规划总结

  • 2012-03-05 21:21
  • 388KB
  • 下载

整数划分总结(动态规划)

先引入一个比较实际的问题:分苹果 题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。 1<=M<=10,1<=Nm:必定有n-m个盘子永远空着,去掉它们对摆放苹果...

动态规划总结-by Amber.doc

  • 2007-09-05 18:39
  • 94KB
  • 下载

动态规划总结与思考

这是一篇关于动态规划的思考文章,主要讲了我对动态规划的一些思考与总结。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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