动态规划方法采用最优原则(principle of optimality)来建立用于计算最优解的递归式。
所谓最优原则即不管前面的策略如何,此后的决策必须是基于当前状态的最优决策。
动态规划法:
在求解某些问题的时候,可以试着吧问题分成必要多的子问题,每个子问题又可以分成数目不确定的必要多的子子问题,这样就会产生大量的子问题。如果分得的子问题界限不清,相互交叉,则在大量的子问题中会存在一些完全相同的子问题。为了避免重复解这些相同的子问题,可以在解决一个子问题之后把它的解保留下来,若遇到求解与之相同的子问题的饿时候,就可以把它找出来直接使用。
为求解问题而将它的子问题的解填入表中以待需要的时候查表,这样的方法就是动态规划法。
应用:
0/1背包问题
//递归实现 int F(int i;int y) { //return F(i,y); if(i==n) return (y<w[n])?0:p[n]; if(y<w[i]) return F(i+1,y); return max(F(i+1,y),F(i+1,y-w[i])+p[i]); }
t(1)=a,t(n)<=2t(n-1)+b ==> t(n)=O(2n)
例: