動態規劃的遞迴函式法

2022-09-23 12:45:03 字數 1743 閱讀 8700

4.1 原始遞迴法

4.2 改進遞迴法

4.3 習題

4.1 原始遞迴法

先看完全揹包問題

乙個旅行者有乙個最多能用m公斤的揹包,現在有n種物品,每件的重量分別是w1,w2,...,wn,

每件的價值分別為c1,c2,...,cn.若的每種物品的件數足夠多.

求旅行者能獲得的最大總價值。

本問題的數學模型如下:

設 f(x)表示重量不超過x公斤的最大價值,則 f(x)=max 當x>=w[i] 1<=i<=n可使用遞迴法解決問題程式如下:

program knapsack04;

const maxm=200;maxn=30;

type ar=array[0..maxn] of integer;

var m,n,j,i,t:integer;

c,w:ar;

function f(x:integer):integer;

var i,t,m:integer;

begin

if x=0 then f:=0 elsebegin

t:=-1;

for i:=1 to n do

begin

if x>=w[i] then m:=f(x-i)+c[i];

if m>t then t:=m;

end;

f:=t;

end;

end;

begin

readln(m,n);

for i:= 1 to n do

readln(w[i],c[i]);

writeln(f(m));

end.

說明:當m不大時,程式設計很簡單,但當m較大時,容易超時.

4.2 改進的遞迴法

改進的的遞迴法的思想還是以空間換時間,這只要將遞迴函式計算過程中的各個子函式的值儲存起來,開闢乙個

一維陣列即可

程式如下:

program knapsack04;

const maxm=2000;maxn=30;

type ar=array[0..maxn] of integer;

var m,n,j,i,t:integer;

c,w:ar;

p:array[0..maxm] of integer;

function f(x:integer):integer;

var i,t,m:integer;

begin

if p[x]<>-1 then f:=p[x]else

begin

if x=0 then p[x]:=0 elsebegin

t:=-1;

for i:=1 to n do

begin

if x>=w[i] then m:=f(i-w[i])+c[i];

if m>t then t:=m;

end;

p[x]:=t;

end;

f:=p[x];

end;

end;

begin

readln(m,n);

for i:= 1 to n do

readln(w[i],c[i]);

fillchar(p,sizeof(p),-1);

writeln(f(m));

end.

4.3習題

用改進的遞迴法解資源分配問題:

n個資源分配到m個專案上,i專案分配j個資源可獲益a[i,j],求最大總效益。

動態規劃DP的使用條件

任何思想方法都有一定的侷限性,超出了特定條件,它就失去了作用。同樣,動態規劃也並不是萬能的。適用動態規劃的問題必須滿足最優化原理和無後效性。1.最優化原理 最優子結構性質 最優化原理可這樣闡述 乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最...

函式的表示法教學設計

1 掌握函式的三種表示方法 圖象法 列表法 解析法 會根據不同的需要選擇恰當的方法表示函式 通過具體的例項,在不同的表示法的選擇 轉化中,逐步學會用恰當的方法表示乙個函式,逐步養成用不同方法表示乙個函式的習慣,尤其是增強數與形結合的意識 2 了解簡單的分段函式,並能簡單的應用 通過具體例項 如計程車...

《函式的表示法》導學案

高一數學編號 sx 11 01 008 撰稿 黃先政審核 張春娥時間 2011 9 15 姓名班級 組別 組名 學習目標 1.了解函式的一些表示法,會根據不同情境選擇合適的方法表示函式,樹立應用數形結合的思想 2.通過具體事例。了解簡單的分段函式,並能簡單應用 3.會用描點法畫一些簡單函式圖象,培養...