![動態(tài)規(guī)劃例題眾多詳細(xì)講解-課件_第1頁](http://file4.renrendoc.com/view5/M01/03/3D/wKhkGGYK21aATL3iAAHwV7hnsSo193.jpg)
![動態(tài)規(guī)劃例題眾多詳細(xì)講解-課件_第2頁](http://file4.renrendoc.com/view5/M01/03/3D/wKhkGGYK21aATL3iAAHwV7hnsSo1932.jpg)
![動態(tài)規(guī)劃例題眾多詳細(xì)講解-課件_第3頁](http://file4.renrendoc.com/view5/M01/03/3D/wKhkGGYK21aATL3iAAHwV7hnsSo1933.jpg)
![動態(tài)規(guī)劃例題眾多詳細(xì)講解-課件_第4頁](http://file4.renrendoc.com/view5/M01/03/3D/wKhkGGYK21aATL3iAAHwV7hnsSo1934.jpg)
![動態(tài)規(guī)劃例題眾多詳細(xì)講解-課件_第5頁](http://file4.renrendoc.com/view5/M01/03/3D/wKhkGGYK21aATL3iAAHwV7hnsSo1935.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
動態(tài)規(guī)劃例題眾多詳細(xì)講解參與競賽的同學(xué)應(yīng)由競爭關(guān)系和獨(dú)立關(guān)系(你做你的,我干我的,程序和算法互相保密,彼此津津樂道于對方的失敗和自己的成功)轉(zhuǎn)向合作學(xué)習(xí)的關(guān)系(通過研討算法、集中編程、互測數(shù)據(jù)等互相合作的方式完成學(xué)習(xí)任務(wù))1動態(tài)規(guī)劃例題眾多詳細(xì)講解參與競賽的同學(xué)應(yīng)由競爭關(guān)系和獨(dú)立關(guān)系F(n)=
1 ifn=0or1F(n-1)+F(n-2) ifn>1n012345678910F(n)1123581321345589斐波納契數(shù)列F(n)2F(n)=1 ifn=0or1n0123456精品資料3精品資料3你怎么稱呼老師?如果老師最后沒有總結(jié)一節(jié)課的重點(diǎn)的難點(diǎn),你是否會認(rèn)為老師的教學(xué)方法需要改進(jìn)?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽曬,也不怕那風(fēng)雨狂,只怕先生罵我笨,沒有學(xué)問無顏見爹娘……”“太陽當(dāng)空照,花兒對我笑,小鳥說早早早……”44動態(tài)規(guī)劃例題眾多詳細(xì)講解遞歸版本:F(n)1 if
n=0orn=1then2 return13 else4 returnF(n-1)+F(n-2)動態(tài)規(guī)劃:F(n)1 A[0]=A[1]←12 for
i
←2to
n
do3 A[i]←A[i-1]+A[i-2]4 returnA[n]太慢!有效率!算法復(fù)雜度是O(n)5動態(tài)規(guī)劃例題眾多詳細(xì)講解遞歸版本:動態(tài)規(guī)劃:太慢!有效率!5動態(tài)規(guī)劃例題眾多詳細(xì)講解構(gòu)造一個公式,它表示一個問題的解是與它的子問題的解相關(guān)的公式.
E.g.F(n)=F(n-1)+F(n-2).為這些子問題做索引
,以便它們能夠在表中更好的存儲與檢索
(i.e.,數(shù)組array【】)以自底向上的方法來填寫這表格;首先填寫最小子問題的解.這就保證了當(dāng)我們解決一個特殊的子問題時,可以利用比它更小的所有可利用的子問題的解.由于歷史原因,我們稱這種方法為:動態(tài)規(guī)劃.在上世紀(jì)40年代末
(計(jì)算機(jī)普及很少時),
這些規(guī)劃設(shè)計(jì)是與”列表“方法相關(guān)的.6動態(tài)規(guī)劃例題眾多詳細(xì)講解構(gòu)造一個公式,它表示一個問題的解是與動態(tài)規(guī)劃例題眾多詳細(xì)講解算法思想將待求解的問題分解成若干個子問題,并存儲子問題的解而避免計(jì)算重復(fù)的子問題,并由子問題的解得到原問題的解。動態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問題。動態(tài)規(guī)劃算法的基本要素:最優(yōu)子結(jié)構(gòu)性質(zhì)和重疊子問題。原理7動態(tài)規(guī)劃例題眾多詳細(xì)講解算法思想原理7最優(yōu)子結(jié)構(gòu)性質(zhì):問題的最優(yōu)解包含著它的子問題的最優(yōu)解。即不管前面的策略如何,此后的決策必須是基于當(dāng)前狀態(tài)(由上一次決策產(chǎn)生)的最優(yōu)決策。重疊子問題:在用遞歸算法自頂向下解問題時,每次產(chǎn)生的子問題并不總是新問題,有些問題被反復(fù)計(jì)算多次。對每個子問題只解一次,然后將其解保存起來,以后再遇到同樣的問題時就可以直接引用,不必重新求解。原理8最優(yōu)子結(jié)構(gòu)性質(zhì):問題的最優(yōu)解包含著它的子問題的最優(yōu)解。即不管動態(tài)規(guī)劃例題眾多詳細(xì)講解解決問題的基本特征1.動態(tài)規(guī)劃一般解決最值(最優(yōu),最大,最小,最長……)問題;2.動態(tài)規(guī)劃解決的問題一般是離散的,可以分解(劃分階段)的;3.動態(tài)規(guī)劃解決的問題必須包含最優(yōu)子結(jié)構(gòu),即可以由(n-1)的最優(yōu)推導(dǎo)出n的最優(yōu)原理9動態(tài)規(guī)劃例題眾多詳細(xì)講解解決問題的基本特征1.動態(tài)規(guī)劃一般動態(tài)規(guī)劃算法的4個步驟:
1.刻畫最優(yōu)解的結(jié)構(gòu)特性.(一維,二維,三維數(shù)組)2.遞歸的定義最優(yōu)解.(狀態(tài)轉(zhuǎn)移方程)3.以自底向上的方法來計(jì)算最優(yōu)解.4.從計(jì)算得到的解來構(gòu)造一個最優(yōu)解.解決問題的基本步驟原理10動態(tài)規(guī)劃算法的4個步驟:解決問題的基本步驟原理10實(shí)例例題一.斐波納契數(shù)列F(n)F(n)=
1 ifn=0or1F(n-1)+F(n-2) ifn>1步驟1:用F(n)表示在斐波納契數(shù)列中第n個數(shù)的值;步驟2:狀態(tài)轉(zhuǎn)移方程:步驟3:以自底向上的方法來計(jì)算最優(yōu)解n012345678910F(n)1123581321345589步驟4:在數(shù)組中分析構(gòu)造出問題的解;11實(shí)例例題一.斐波納契數(shù)列F(n)F(n)=1 if例題二.輸入n,求出n!F(n)=
1 ifn=0or1F(n-1)*n ifn>1步驟1:用F(n)表示n!的值;步驟2:狀態(tài)轉(zhuǎn)移方程:步驟3:以自底向上的方法來計(jì)算最優(yōu)解n012345678910F(n)112624120720實(shí)例12例題二.輸入n,求出n!F(n)=1 ifn=動態(tài)規(guī)劃例題眾多詳細(xì)講解
一場演唱會即將舉行?,F(xiàn)有n個歌迷排隊(duì)買票,一個人買一張,而售票處規(guī)定,一個人每次最多只能買兩張票。假設(shè)第i位歌迷買一張票需要時間Ti(1≤i≤n),隊(duì)伍中相鄰的兩位歌迷(第j個人和第j+1個人)也可以由其中一個人買兩張票,而另一位就可以不用排隊(duì)了,則這兩位歌迷買兩張票的時間變?yōu)镽j,假如Rj<Tj+Tj+1,這樣做就可以縮短后面歌迷等待的時間,加快整個售票的進(jìn)程?,F(xiàn)給出n,Tj和Rj,求使每個人都買到票的最短時間和方法。實(shí)例13動態(tài)規(guī)劃例題眾多詳細(xì)講解一場演唱會即將舉行?,F(xiàn)有n個歌迷排分析:如果前i個人買票的最優(yōu)買票方式一確定,比如第i-1個人買一張票,則前i-1個人的買票方式也一定是最優(yōu)的。即問題的最優(yōu)解包含子問題的最優(yōu)解。12345i…in-1nn-2…步驟1:用F(i)表示前i個人買票的最優(yōu)方式,即所需最短時間;現(xiàn)在要決定F(i)需要考慮兩種情況:(1)第i個人的票自己買(2)第i個人的票由第i-1個人買步驟2:狀態(tài)轉(zhuǎn)移方程:min步驟3:以自底向上的方法來計(jì)算最優(yōu)解14分析:如果前i個人買票的最優(yōu)買票方式一確定,比如第i-1個人動態(tài)規(guī)劃例題眾多詳細(xì)講解BuyTicks(T,R)1n←length[T]2f[0]←03f[1]←T[1]4fori←2ton
do5
f[i]←f[i-2]+R[i-1]6iff[i]
>f[i-1]+T[i]then7f[i]←f[i-1]+T[i]8returnf15動態(tài)規(guī)劃例題眾多詳細(xì)講解BuyTicks(T,R)15實(shí)例動態(tài)規(guī)劃例題眾多詳細(xì)講解1.問題描述設(shè)有一個正整數(shù)的序列:b1,b2,…,bn,對于下標(biāo)i1<i2<…<im,若有bi1≤bi2≤…≤bim則稱存在一個長度為m的不下降序列。例如,下列數(shù)列
13791638243718441921226315
對于下標(biāo)i1=1,i2=4,i3=5,i4=9,i5=13,滿足13<16<38<44<63,則存在長度為5的不下降序列。但是,我們看到還存在其他的不下降序列:i1=2,i2=3,i3=4,i4=8,i5=10,i6=11,i7=12,i8=13,滿足:7<9<16<18<19<21<22<63,則存在長度為8的不下降序列。問題為:當(dāng)b1,b2,…,bn給出之后,求出最長的不下降序列。步驟1:用F(i)表示第i項(xiàng)到最后一項(xiàng)最長不下降序列的長度的值;步驟2:狀態(tài)轉(zhuǎn)移方程;d[i]表示數(shù)列中第i項(xiàng)的值;步驟3:以自底向上的方法來計(jì)算最優(yōu)解16實(shí)例動態(tài)規(guī)劃例題眾多詳細(xì)講解1.問題描述步驟1:用F(i)拓展1:
攔截導(dǎo)彈
(vijos1303)某國為了防御敵國的導(dǎo)彈襲擊,發(fā)展出一種導(dǎo)彈攔截系統(tǒng)。但是這種導(dǎo)彈攔截系統(tǒng)有一個缺陷:雖然它的第一發(fā)炮彈能夠到達(dá)任意的高度,但是以后每一發(fā)炮彈都不能高于前一發(fā)的高度。某天,雷達(dá)捕捉到敵國的導(dǎo)彈來襲。由于該系統(tǒng)還在試用階段,所以只有一套系統(tǒng),因此有可能不能攔截所有的導(dǎo)彈。輸入導(dǎo)彈依次飛來的高度(雷達(dá)給出的高度數(shù)據(jù)是不大于30000的正整數(shù)),計(jì)算這套系統(tǒng)最多能攔截多少導(dǎo)彈,如果要攔截所有導(dǎo)彈最少要配備多少套這種導(dǎo)彈攔截系統(tǒng)。
樣例:
INPUTOUTPUT389207155300299170158656(最多能攔截的導(dǎo)彈數(shù))
2(要攔截所有導(dǎo)彈最少要配備的系統(tǒng)數(shù))17拓展1:攔截導(dǎo)彈(vijos1303)某國為了防御敵國的拓展2:低價購買
“低價購買”這條建議是在奶牛股票市場取得成功的一半規(guī)則。要想被認(rèn)為是偉大的投資者,你必須遵循以下的問題建議:“低價購買;再低價購買”。每次你購買一支股票,你必須用低于你上次購買它的價格購買它。買的次數(shù)越多越好!你的目標(biāo)是在遵循以上建議的前提下,求你最多能購買股票的次數(shù)。你將被給出一段時間內(nèi)一支股票每天的出售價(216范圍內(nèi)的正整數(shù)),你可以選擇在哪些天購買這支股票。每次購買都必須遵循“低價購買;再低價購買”的原則。寫一個程序計(jì)算最大購買次數(shù)。這里是某支股票的價格清單:日期123456789101112價格686954646864706778629887最優(yōu)秀的投資者可以購買最多4次股票,可行方案中的一種是:日期25610價格69686462輸入第1行:N(1<=N<=5000),股票發(fā)行天數(shù)第2行:N個數(shù),是每天的股票價格。輸出輸出文件僅一行包含兩個數(shù):最大購買次數(shù)和擁有最大購買次數(shù)的方案數(shù)(<=231)當(dāng)二種方案“看起來一樣”時(就是說它們構(gòu)成的價格隊(duì)列一樣的時候),這2種方案被認(rèn)為是相同的。18拓展2:低價購買“低價購買”這條建議是在奶牛股票市場取得成拓展3:合唱隊(duì)形(vijis1098)N位同學(xué)站成一排,音樂老師要請其中的(N-K)位同學(xué)出列,使得剩下的K位同學(xué)排成合唱隊(duì)形。
合唱隊(duì)形是指這樣的一種隊(duì)形:設(shè)K位同學(xué)從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK,
則他們的身高滿足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任務(wù)是,已知所有N位同學(xué)的身高,計(jì)算最少需要幾位同學(xué)出列,可以使得剩下的同學(xué)排成合唱隊(duì)形。輸入的第一行是一個整數(shù)N(2<=N<=100),表示同學(xué)的總數(shù)。第一行有n個整數(shù),用空格分隔,第i個整數(shù)Ti(130<=Ti<=230)是第i位同學(xué)的身高(厘米)。輸出包括一行,這一行只包含一個整數(shù),就是最少需要幾位同學(xué)出列。樣例輸入8186186150200160130197220樣例輸出:419拓展3:合唱隊(duì)形(vijis1098)N位同學(xué)例題五.馬攔過河卒實(shí)例[問題描述]:
如圖,A點(diǎn)有一個過河卒,需要走到目標(biāo)B點(diǎn)。卒行走規(guī)則:可以向下、或者向右。同時在棋盤上的任一點(diǎn)有一個對方的馬(如上圖的C點(diǎn)),該馬所在的點(diǎn)和所有跳躍一步可達(dá)的點(diǎn)稱為對方馬的控制點(diǎn)。例如上圖C點(diǎn)上的馬可以控制9個點(diǎn)(圖中的P1,P2…P8和C)。卒不能通過對方馬的控制點(diǎn)。棋盤用坐標(biāo)表示,A點(diǎn)(0,0)、B點(diǎn)(n,m)(n,m為不超過20的整數(shù),并由鍵盤輸入),同樣馬的位置坐標(biāo)是需要給出的(約定:C<>A,同時C<>B)?,F(xiàn)在要求你計(jì)算出卒從A點(diǎn)能夠到達(dá)B點(diǎn)的路徑的條數(shù)。[輸入]:
鍵盤輸入
B點(diǎn)的坐標(biāo)(n,m)以及對方馬的坐標(biāo)(X,Y){不用盤錯}[輸出]:
屏幕輸出
一個整數(shù)(路徑的條數(shù))。[輸入輸出樣例]:
輸入:
6632
輸出:
17
20例題五.馬攔過河卒實(shí)例[問題描述]:
如圖,A點(diǎn)步驟1:用F(X,Y)表示到棋盤上每個階段(X,Y)的路徑條數(shù);步驟2:狀態(tài)轉(zhuǎn)移方程:步驟3:以自底向上的方法來計(jì)算最優(yōu)解分析:階段:棋盤上的每個可走的點(diǎn);每個階段的求解;F(X,Y)=F(X-1,Y)+F(X,Y-1)其中,F(xiàn)(0,0)=1F(0,Y)=1F(X,0)=121步驟1:用F(X,Y)表示到棋盤上每個階段(X,Y)的路徑條例題六:數(shù)字三角形問題1.問題描述設(shè)有一個三角形的數(shù)塔,頂點(diǎn)結(jié)點(diǎn)稱為根結(jié)點(diǎn),每個結(jié)點(diǎn)有一個整數(shù)數(shù)值。從頂點(diǎn)出發(fā),可以向左走,也可以向右走。如圖10一1所示。問題:當(dāng)三角形數(shù)塔給出之后,找出一條從第一層到達(dá)底層的路徑,使路徑的值最大。若這樣的路徑存在多條,任意給出一條即可。22例題六:數(shù)字三角形問題1.問題描述問題:當(dāng)三角形數(shù)塔給出之步驟1二維數(shù)組D(X,y)描述問題,D(X,y)表示從頂層到達(dá)第X層第y個位置的最小路徑得分。步驟2:狀態(tài)轉(zhuǎn)移方程階段分析:D(1,1)=13
到第x層的第y個位置有兩種可能,要么走右分支得到,要么走左分支得到。
D(X,y)=min{D(X-1,y),D(X-1,y-1}+a(X,y)D(1,1)=a(1,1)23步驟1二維數(shù)組D(X,y)描述問題,D(X,y)表示從頂層拓展:棧(vijos1122)【問題背景】棧是計(jì)算機(jī)中經(jīng)典的數(shù)據(jù)結(jié)構(gòu),簡單的說,棧就是限制在一端進(jìn)行插入刪除操作的線性表。棧有兩種最重要的操作,即pop(從棧頂彈出一個元素)和push(將一個元素進(jìn)棧)。寧寧考慮的是這樣一個問題:一個操作數(shù)序列,從1,2,一直到n(圖示為1到3的情況),棧A的深度大于n?,F(xiàn)在可以進(jìn)行兩種操作,1.將一個數(shù),從操作數(shù)序列的頭端移到棧的頭端(對應(yīng)數(shù)據(jù)結(jié)構(gòu)棧的push操作)2.將一個數(shù),從棧的頭端移到輸出序列的尾端(對應(yīng)數(shù)據(jù)結(jié)構(gòu)棧的pop操作)24拓展:棧(vijos1122)【問題背景】棧是計(jì)算機(jī)中經(jīng)使用這兩種操作,由一個操作數(shù)序列就可以得到一系列的輸出序列,下圖所示為由123生成序列231的過程。(原始狀態(tài)如上圖所示)12312313222323125125你的程序?qū)o定的n,計(jì)算并輸出由操作數(shù)序列1,2,…,n經(jīng)過操作可能得到的輸出序列的總數(shù)?!据斎敫袷健枯斎胛募缓粋€整數(shù)n(1≤n≤18)【輸出格式】輸出文件只有一行,即可能輸出序列的總數(shù)目【輸入樣例】3【輸出樣例】526你的程序?qū)o定的n,計(jì)算并輸出由操作數(shù)序列1,2,…,n經(jīng)動態(tài)規(guī)劃例題眾多詳細(xì)講解一個給定序列的子序列是在該序列中刪去若干元素后得到的序列。給定兩個序列X和Y,當(dāng)另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。最長公共子序列:公共子序列中長度最長的子序列。最長公共子序列問題給定兩個序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的一個最長公共子序列。例如:
X=(A,B,C,B,D,A,B)X的子序列:所有X的子集(集合中元素按原來在X中的順序排列) (A,B,D),(B,C,D,B),等等.27動態(tài)規(guī)劃例題眾多詳細(xì)講解一個給定序列的子序列是在該序列中刪去動態(tài)規(guī)劃例題眾多詳細(xì)講解X=(A,B,C,B,D,A,B)X=(A,B,C,B,D,A,B)Y=(B,D,C,A,B,A) Y=(B,D,C,A,B,A)(B,C,B,A)和(B,D,A,B)都是X和Y
的最長公共子序列(長度為4)但是,(B,C,A)就不是X和Y的最長公共子序列28動態(tài)規(guī)劃例題眾多詳細(xì)講解X=(A,B,C,B,D動態(tài)規(guī)劃例題眾多詳細(xì)講解對于每一個Xm的子序列,驗(yàn)證它是否是Yn的子序列.Xm有2m個子序列每個子序列需要o(n)的時間來驗(yàn)證它是否是Yn的子序列.從Yn的第一個字母開始掃描下去,如果不是則從第二個開始運(yùn)行時間:o(n2m)29動態(tài)規(guī)劃例題眾多詳細(xì)講解對于每一個Xm的子序列,驗(yàn)證它是否是給定一個序列Xm=(x1,x2,…,xm),我們定義Xm的第i個前綴為:
Xi=(x1,x2,…,xi)i=0,1,2,…,mc[i,j]為序列Xi=(x1,x2,…,xi)和Yj
=(y1,y2,…,yj)的最長公共子序列的長度.分析:最優(yōu)子結(jié)構(gòu)性質(zhì):設(shè)序列Xm={x1,x2,…,xm}和Yn={y1,y2,…,yn}的一個最長公共子序列為Zk={z1,z2,…,zk},則1.若xm=yn,則zk=xm=yn,且Zk-1是Xm-1和Yn-1的最長公共子序列。2.若xm≠yn,且zk≠xm,則Zk是Xm-1和Yn的最長公共子序列。3.若xm≠yn,且zk≠yn,則Zk是Xm和Yn-1的最長公共子序列。步驟1步驟230給定一個序列Xm=(x1,x2,…,xm),我們定動態(tài)規(guī)劃例題眾多詳細(xì)講解00000000000yj:xmy1y2ynx1x2xii012nm120firstsecond步驟331動態(tài)規(guī)劃例題眾多詳細(xì)講解00000000000yj:xmy1動態(tài)規(guī)劃例題眾多詳細(xì)講解00000000000yj:DACFABxiji012nm120矩陣b[i,j]:它告訴我們要獲得最優(yōu)結(jié)果應(yīng)該如何選擇如果xi=yj
b[i,j]=1如果 c[i-1,j]≥c[i,j-1]
b[i,j]=2否則
b[i,j]=333CDc[i,j-1]c[i-1,j]32動態(tài)規(guī)劃例題眾多詳細(xì)講解00000000000yj:DACFLCS-LENGTH(X,Y,m,n)1
for
i←1to
m
do
c[i,0]←02
for
j←0to
n
do
c[0,j]←03
for
i←1to
m
do4
for
j←1to
n
do5
if
xi=yj6
then
c[i,j]←c[i-1,j-1]+17 b[i,j]←“↖”8
elseif
c[i-1,j]≥c[i,j-1]9
then
c[i,j]←c[i-1,j]10 b[i,j]←“↑”11
else
c[i,j]←c[i,j-1]12 b[i,j]←“←”13
return
candb運(yùn)行時間:(nm)33LCS-LENGTH(X,Y,m,n)運(yùn)行時間:(動態(tài)規(guī)劃例題眾多詳細(xì)講解X=(B,D,C,A,B,A)Y=(A,B,C,B,D,A,B)0126345yjBDACAB51203467DABxiCBAB00000000000000
0
0
0
1
1
1
1
1
1
1
2
2
1
1
2
2
2
2
1
1
2
2
3
3
1
2
2
2
3
3
1
2
3
2
3
4
1
2
2
3
4
4如果xi=yj
b[i,j]=“”如果 c[i-1,j]≥c[i,j-1]
b[i,j]=“”否則
b[i,j]=“”34動態(tài)規(guī)劃例題眾多詳細(xì)講解X=(B,D,C,A,B動態(tài)規(guī)劃例題眾多詳細(xì)講解PRINT-LCS(b,X,i,j)1
if
i=0orj=02thenreturn3if
b[i,j]="↖"4then
PRINT-LCS(b,X,i-1,j-1)5printxi6elseif
b[i,j]="↑"7then
PRINT-LCS(b,X,i-1,j)8else
PRINT-LCS(b,X,i,j-1)35動態(tài)規(guī)劃例題眾多詳細(xì)講解PRINT-LCS(b,X,i,動態(tài)規(guī)劃例題眾多詳細(xì)講解小偷有一個可承受W的背包有n件物品:第i個物品價值vi
且重wi目標(biāo):找到xi使得對于所有的xi={0,1},i=1,2,..,n
wixi
W
并且
xivi
最大部分背包問題36動態(tài)規(guī)劃例題眾多詳細(xì)講解小偷有一個可承受W的背包部分背包問題動態(tài)規(guī)劃例題眾多詳細(xì)講解考慮最多重W的物品且價值最高如果我們把j物品從背包中拿出來
剩下的裝載一定是取自n-1個物品使得不超過載重量W–wj并且所裝物品價值最高的裝載37動態(tài)規(guī)劃例題眾多詳細(xì)講解考慮最多重W的物品且價值最高37動態(tài)規(guī)劃例題眾多詳細(xì)講解對于每一個物品i,都有兩種情況需要考慮第1種情況:物品i的重量wi<=w,小偷對物品i可拿或者不拿
P[i,w]=max{P[i-1,w],P[i-1,w-wi]+vi}第2種情況:物品i的重量wi>w,即小偷不拿物品i
P(i,w)=P(i-1,w)步驟1P(i,w)–考慮前i件物品所能獲得的最高價值,其中w是背包的承受力步驟2階段分析:P(i,w)=P(i-1,w)當(dāng)wi<w(不夠裝不裝)maxP(i-1,w)夠裝但不裝p(i-1,w-wi)+pi夠裝而且裝38動態(tài)規(guī)劃例題眾多詳細(xì)講解對于每一個物品i,都有兩種情Knapsack(S,W)1for
w
←0to
w1-1do
P[1,w]←0;2for
w
←
w1
to
W
do
P[1,w]←
v1;3for
i
←2to
n
do4for
w
←0to
W
do5if
wi>w
then6P[i,w]←
P[i-1,w];7else8P[i,w]←max{P[i-1,w],P[i-1,w-wi]+vi}運(yùn)行時間:(nW)39Knapsack(S,W)運(yùn)行時間:(nW)39動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000000000000:n1w-wiWi-10first
P(i,w)=max{vi
+P(i-1,w-wi),P(i-1,w)}帶走物品i不帶走物品iiwsecond40動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000000000000P(i,w)=max{vi+P(i-1,w-wi),P(i-1,w)}
0000000000物品重量價值12122110332042150123451234W=5012121212101222222210122230321015253037P(1,1)=
P(1,2)=P(1,3)=P(1,4)=P(1,5)=P(2,1)=P(2,2)=P(2,3)=P(2,4)=P(2,5)=P(3,1)=P(3,2)=P(3,3)=P(3,4)=P(4,5)=P(4,1)=P(4,2)=P(4,3)=P(4,4)=P(4,5)=max{12+0,0}=12max{12+0,0}=12max{12+0,0}=12max{12+0,0}=12max{10+0,0}=10max{10+0,12}=12max{10+12,12}=22max{10+12,12}=22max{10+12,12}=22P(2,1)=10P(2,2)=12max{20+0,22}=22max{20+10,22}=30max{20+12,22}=32P(3,1)=10max{15+0,12}=15max{15+10,22}=25max{15+12,30}=30max{15+22,32}=370P(0,1)=0wi41P(i,w)=max{vi+P(i-1,w動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000001234512340121212121012222222101222303210152530370從P(n,W)開始當(dāng)往左上走
物品i被帶走當(dāng)直往上走
物品i未被帶走物品4物品2物品142動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000001234512動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000000000000:n1Wi-10
P(i,w)=max{vi
+P(i-1,w-wi),P(i-1,w)}iw例如:所有用灰色表示的子問題都取決于P(i-1,w)43動態(tài)規(guī)劃例題眾多詳細(xì)講解000000000000000000動態(tài)規(guī)劃例題眾多詳細(xì)講解100101108108681006282861001623823816510000000000000111111111例子:
n=5,p=[6,3,5,4,6],w=[2,2,6,5,4],W=1044動態(tài)規(guī)劃例題眾多詳細(xì)講解100101108108681006拓展1:裝箱問題(vijos1133)有一個箱子容量為v(正整數(shù),o≤v≤20000),同時有n個物品(o≤n≤30),每個物品有一個體積(正整數(shù))。要求從n個物品中,任取若千個裝入箱內(nèi),使箱子的剩余空間為最小。輸入格式InputFormat第一行,一個整數(shù),表示箱子容量;
第二行,一個整數(shù),表示有n個物品;
接下來n行,分別表示這n個物品的各自體積。輸出格式OutputFormat一個整數(shù),表示箱子剩余空間。樣例輸入SampleInput2468312797樣例輸出SampleOutput045拓展1:裝箱問題(vijos1133)有一個箱子容量為拓展2:采藥(vijos1104)辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫(yī)師。為此,他想拜附近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個難題。醫(yī)師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應(yīng)該可以讓采到的草藥的總價值最大。”
如果你是辰辰,你能完成這個任務(wù)嗎?
輸入格式InputFormat輸入的第一行有兩個整數(shù)T(1<=T<=1000)和M(1<=M<=100),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞里的草藥的數(shù)目。接下來的M行每行包括兩個在1到100之間(包括1和100)的整數(shù),分別表示采摘某株草藥的時間和這株草藥的價值。輸出格式OutputFormat輸出包括一行,這一行只包含一個整數(shù),表示在規(guī)定的時間內(nèi),可以采到的草藥的最大總價值。樣例輸入SampleInput7037110069112樣例輸出SampleOutput346拓展2:采藥(vijos1104)辰辰是拓展3:開心的金明(vijos1317)金明今天很開心,家里購置的新房就要領(lǐng)鑰匙了,新房里有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎么布置,你說了算,只要不超過N元錢就行”。今天一早金明就開始做預(yù)算,但是他想買的東西太多了,肯定會超過媽媽限定的N元。于是,他把每件物品規(guī)定了一個重要度,分為5等:用整數(shù)1~5表示,第5等最重要。他還從因特網(wǎng)上查到了每件物品的價格(都是整數(shù)元)。他希望在不超過N元(可以等于N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。設(shè)第j件物品的價格為v[j],重要度為w[j],共選中了k件物品,編號依次為j1...jk,則所求的總和為:v[j1]*w[j1]+..+v[jk]*w[jk]請你幫助金明設(shè)計(jì)一個滿足要求的購物單.輸入格式InputFormat輸入的第1行,為兩個正整數(shù),用一個空格隔開:
Nm
(其中N(<30000)表示總錢數(shù),m(<25)為希望購買物品的個數(shù)。)
從第2行到第m+1行,第j行給出了編號為j-1
的物品的基本數(shù)據(jù),每行有2個非負(fù)整數(shù)
vp
(其中v表示該物品的價格(v≤10000),p表示該物品的重要度(1~5))47拓展3:開心的金明(vijos1317)輸出格式OutputFormat輸出只有一個正整數(shù),為不超過總錢數(shù)的物品的價格與重要度乘積的總和的
最大值(<100000000)樣例輸入SampleInput1000580024005300540032002樣例輸出SampleOutput390048輸出格式OutputFormat輸出只有一個正整數(shù),為拓展4:金明的預(yù)算方案(vijos1313)金明今天很開心,家里購置的新房就要領(lǐng)鑰匙了,新房里有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎么布置,你說了算,只要不超過N元錢就行”。今天一早,金明就開始做預(yù)算了,他把想買的物品分為兩類:主件與附件,附件是從屬于某個主件的,下表就是一些主件與附件的例子:
主件附件
電腦打印機(jī),掃描儀
書柜圖書
書桌臺燈,文具
工作椅無
如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有0個、1個或2個附件。附件不再有從屬于自己的附件。金明想買的東西很多,肯定會超過媽媽限定的N元。于是,他把每件物品規(guī)定了一個重要度,分為5等:用整數(shù)1~5表示,第5等最重要。他還從因特網(wǎng)上查到了每件物品的價格(都是10元的整數(shù)倍)。他希望在不超過N元(可以等于N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。
設(shè)第j件物品的價格為v[j],重要度為w[j],共選中了k件物品,編號依次為j1,j2,……,jk,則所求的總和為:v[j1]*w[j1]+v[j2]*w[j2]+…+v[jk]*w[jk]。(其中*為乘號)請你幫助金明設(shè)計(jì)一個滿足要求的購物單。
49拓展4:金明的預(yù)算方案(vijos1313)金明今輸入格式InputFormat輸入文件的第1行,為兩個正整數(shù),用一個空格隔開:
N
m
其中N(<32000)表示總錢數(shù),m(<60)為希望購買物品的個數(shù)。)
從第2行到第m+1行,第j行給出了編號為j-1的物品的基本數(shù)據(jù),每行有3個非負(fù)整數(shù)
v
p
q
(其中v表示該物品的價格(v<10000),p表示該物品的重要度(1~5),q表示該物品是主件還是附件。如果q=0,表示該物品為主件,如果q>0,表示該物品為附件,q是所屬主件的編號)
輸出格式OutputFormat輸出文件只有一個正整數(shù),為不超過總錢數(shù)的物品的價格與重要度乘積的總和的最大值
(<200000)。樣例輸入SampleInput100058002040051300514003050020樣例輸出SampleOutput220050輸入格式InputFormat輸入文件的第1行,為兩個例題9:石子歸并描述:在一個圓形操場的四周擺放著N堆石子(N<=
100),現(xiàn)要將石子有次序地合并成一堆.規(guī)定每次只能選取相鄰的兩堆合并成新的一堆,并將新的一堆的石子數(shù),記為該次合并的得分.編一程序,由文件讀入堆棧數(shù)N及每堆棧的石子數(shù)(<=20).
(!)選擇一種合并石子的方案,使用權(quán)得做N-1次合并,得分的總和最小;
(2)選擇一種合并石子的方案,使用權(quán)得做N-1次合并,得分的總和最小;
輸入數(shù)據(jù):
第一行為石子堆數(shù)N;
第二行為每堆的石子數(shù),每兩個數(shù)之間用一個空格分隔.
輸出數(shù)據(jù):
從第一至第N行為得分最小的合并方案.第N+1行是空行.從第N+2行到第2N+1行是得分最大合并方案.每種合并方案用N行表示,其中第i行(1<=i<=N)表示第i次合并前各堆的石子數(shù)(依順時針次序輸出,哪一堆先輸出均可).要求將待合并的兩堆石子數(shù)以相應(yīng)的負(fù)數(shù)表示.
輸入輸出范例:
輸入:
4
4
5
9
4
輸出:
最?。?3最大=5451例題9:石子歸并描述:在一個圓形操場的四周擺放著N堆石子(N輸入:
4
4
5
9
4
輸出:
-4
5
9
-4
-8
-5
9
-13
-9
224
-5
-9
4
4
-14
-4
-4
-18
22拓:輸出合并的方案:52輸入:
4
4
5
9
4
輸出:
-4
5
9用〔i,j〕表示一個從第i堆數(shù)起,順時針數(shù)j堆時的子序列
{第i堆、第i+1堆、……、第(i+j-1)modn堆}步驟1f〔i,j〕──將子序列〔i,j〕中的j堆石子合并成一堆的最佳得分和;(結(jié)果數(shù)組)
c〔i,j〕──將〔i,j〕一分為二,其中子序列1的堆數(shù);(記錄分隔點(diǎn))打印合并方案時使用53用〔i,j〕表示一個從第i堆數(shù)起,順時針數(shù)j堆時的子序列
{顯然,對每一堆石子來說,它的
f〔i,1〕=0c〔i,1〕=0(1≤i≤N)
對于子序列〔i,j〕來說,若求最小得分總和,f〔i,j〕的初始值為∞;若求最大得
分總和,f〔i,j〕的初始值為0。(1≤i≤N,2≤j≤N)。
規(guī)劃的方向是順推。先考慮含二堆石子的N個子序列(各子序列分別從第1堆、第2堆、
……、第N堆數(shù)起,順時針數(shù)2堆)的合并方案
f〔1,2〕,f〔2,2〕,……,f〔N,2〕
c〔1,2〕,c〔2,2〕,……,c〔N,2〕
然后考慮含三堆石子的N個子序列(各子序列分別從第1堆、第2堆、……、第N堆
數(shù)起,順時針數(shù)3堆)的合并方案
f〔1,3〕,f〔2,3〕,……,f〔N,3〕
c〔1,3〕,c〔2,3〕,……,c〔N,3〕
……
依次類推,直至考慮了含N堆石子的N個子序列(各子序列分別從第1堆、第2堆、…
…、第N堆數(shù)起,順時針數(shù)N堆)的合并方案
f〔1,N〕,f〔2,N〕,……,f〔N,N〕
c〔1,N〕,c〔2,N〕,……,c〔N,N〕
最后,在子序列〔1,N〕,〔2,N〕,……,〔N,N〕中,選擇得分總和(f值)最
?。ɑ蜃畲螅┑囊粋€子序列〔i,N〕(1≤i≤N),由此出發(fā)倒推合并過程。階段分析:54顯然,對每一堆石子來說,它的
f〔i,1〕=0c〔i,1〕例如對(圖6.2-4)中的6堆石子,按動態(tài)規(guī)劃方程順推最小得分和。依次得出含
二堆石子的6個子序列的合并方案
f〔1,2〕=7f〔2,2〕=10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中化學(xué)上學(xué)期第三周 氧化還原反應(yīng)說課稿
- 7 我們有新玩法 說課稿-2023-2024學(xué)年道德與法治二年級下冊統(tǒng)編版
- 2025二手車購買合同書
- 2025合同的履行、變更、轉(zhuǎn)讓、撤銷和終止
- 14 《窮人》說課稿-2024-2025學(xué)年六年級語文上冊統(tǒng)編版001
- 買方購車合同范本
- 公路修建合同范本
- 鋪設(shè)碎石土路面施工方案
- 輕鋼吊頂施工方案
- 路燈池施工方案
- 葫蘆島尚楚環(huán)??萍加邢薰踞t(yī)療廢物集中處置項(xiàng)目環(huán)評報告
- 冀教版七年級下冊英語課文翻譯
- 全國物業(yè)管理項(xiàng)目經(jīng)理考試試題
- 水文水利課程設(shè)計(jì)報告
- 600字A4標(biāo)準(zhǔn)作文紙
- GB/T 18015.2-2007數(shù)字通信用對絞或星絞多芯對稱電纜第2部分:水平層布線電纜分規(guī)范
- DJI 產(chǎn)品交付理論試題
- FCI測試試題附答案
- 扁平藍(lán)色企業(yè)五險一金知識培訓(xùn)講座宣講通用教學(xué)講座課件
- 新編《公路隧道養(yǎng)護(hù)技術(shù)規(guī)范》解讀課件
- 違紀(jì)行為處罰確認(rèn)單
評論
0/150
提交評論