五、动态规划

本文探讨了动态规划的基本概念及其与递归的区别,并详细解释了动态规划在解决背包问题中的应用。文中列举了三种典型的背包问题:0-1背包、完全背包及多重背包,并给出了相应的算法模板。

刚接触动态规划的时候,我总是和递归递推混淆,感觉他们是一类问题,但接触得多了就理解到,动态规划更多的是是一种思想,一种把整体化为部分,把大问题化为小问题的思想。用动态规划求解一类问题是,需要将问题的全过程恰当的分成若干个相互联系的阶段,以便按一定的次序去求解。或者从初始状态到结束状态,或者反过来,最终求出最优活动路线。

动态规划的解决过程,重点在于在做每一步决策是,列出各种可能的局部解,然后依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,以每一步都是最优的来保证全局是最优的。

本来动态规划已经就让人很晕头转脑的了,但接着就是动态规划里的一大内容——背包问题。背包问题模板性很强,以至于一些问题几乎就能够生生套出来结果,但是在我看来背包问题有两大难点:一是理解背包的原理,这个包括背包问题能够求解的原理和背包问题进行空间优化的原理,这个当时在我能够做一些背包题了之后还在纠结,记得我当时就对着课件上那个价值和重量的例题列表,一个个计算着填表,对比着理解,前前后后画了十多遍,就只是发现它很神奇的就一步一步把性价比低的换成了性价比高的,结果就达到目的了,但具体是怎么着变的,我又说不能够明白。二是在题目中找到正确的背法(我这样称呼它),那种直接看到就能套上模板的题自然不算,要找背法的是难一点的,要找得到哪个是背包,要用怎样的循环,加什么判断条件(if语句),这些都是很麻烦的。

这是三种背包模板:

(1) 0-1背包问题:

  for(i=1……….N)

                  for(j=V..…..…0)

                            dp[j]=max{dp[j],dp[j-c[i]]+w[i]};

(2) 完全背包问题:

 for(i=1……….N)

                  for(j=0..…..…V)

                            dp[j]=max{dp[j],dp[j-c[i]]+w[i]};

(3) 多重背包问题:

 for(i=1……….N)

                  for(j=V..…..…0)

                            for(k=0;k<num[i];k++)

                                    dp[j]=max{dp[j],dp[j-k*c[i]]+k*w[i]};

   这几个模板值得注意的是,完全背包的j循环顺序与其他两个不同,至于为什么,不知道。还有就是多重背包的k循环上有一定的超时可能,所以有一个二进制优化的思想值得考虑,但是这个思想我只用过一次,而且还没有AC掉,五一特训的时候有一个一看就是背包的题,老师说一看就是背包就肯定不是,一定有坑,但是那个题我们好像也只会背包,TLE,让我想到这个二进制做法,依旧TLE,终于到最后师哥说要先贪心再背包,也算是让我长了见识,原来可以混着用,而且看上去好没道理混在一起用,果然,经验是很重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值