动态规划进阶一

动态规划dp(Dynamic Programming)

基本思想:是通过类似分治的方法,将一个人问题分解成多个阶段求解,每一个决策都依赖于当前的状态,决策过后问题又发生转移,通过多步转移方式求解的过程就叫做动态规划。

适用于动态规划的问题应具有的性质:

(1)最优化原理:如果问题的最优解包括子问题的最优解,那么问题的子问题解也是最优解,类似与贪心算法,从局部最优到整体最优;

(2)无后效性:某一个状态一旦确定,将不受该状态以后的状态影响,只与当前状态有关,既无后效性;

(3)有重叠子问题:子问题間不獨立,一個子問題在一個階段會多次調用;

求問題的基本步驟:

動態規劃處理的都是多個狀態的問題,那麼先從一個問題入手

現在有3中硬幣面值為1,3,5,現在要用這三種硬幣湊成11,問所需的硬幣最少為多少?

對於這個問題我們先從最簡單的分析:當i=0即我們需要多少枚硬幣湊夠0元,當然在所有的硬幣中沒有比1更小的,所以為0個,我們用符號記錄下來方便分析,即f(0)=0,那麼當i=1時,因為滿足的只有1元的硬幣,所以我們拿起一枚面值為一的硬幣,然後加上能組成0元的方法,然而這個我們已經知道了,所以f(1)=f(1-1)+1=1,同理那麼當i=2時,f(2)=f(2-1)+1=2,但是當i=3時候就不是這個狀態了,這時候我們要考慮面值為3的硬幣了,所以就分為兩種情況,f(3)=f(3-1)+1=f(2)+1=3,第二種方式f(3)=f(3-3)+1=f(0)+1=1 ,當i=3的兩種選擇解釋為,當我拿起一枚1元的硬幣那麼我需要在加上湊成兩元的硬幣那麼就是當前的方式,第二組我直接拿起面值為3的硬幣 那么只需要湊成0元的就是當前的方式,題目要求選取最小的組成,所以f(3)=1,所以得到的狀態轉移方程為f(i)=min(f(i-vi)+1),所謂的狀態轉移就是將一個大問題轉化為多個子問題解決,求子問題的最優解得到問題的最優解;

偽代碼:

for( i=1–S)

for( j=0–n-1)

if( v<i and  f(i)=min( f(i-v)+1,f(i) ) )

其實這就是一維背包的算法。

posted @ 2014-11-02 11:30  NYNU_ACM  阅读(221)  评论(0编辑  收藏  举报