关闭

动态规划总结

77人阅读 评论(0) 收藏 举报
分类:


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

对于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能取得的最大权值 。

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

 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6579次
    • 积分:694
    • 等级:
    • 排名:千里之外
    • 原创:67篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类