演算法設計與分析 動態規劃

2021-10-05 16:02:53 字數 2496 閱讀 7474

最大子段和問題

① 給定由n個整數(包含負整數)組成的序列a1,a2,…,an,求該序列子段和的最大值。

i.當所有整數均為負值時定義其最大子段和為0。

②所求的最優值為:

i.例如,當(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)時,最大子段和為:

③bj是1到j位置的最大子段和:

④由bj的定義易知,當bj-1>0時bj=bj-1+aj,否則bj=aj。

⑤則計算bj的動態規劃遞迴式:

bj=max,1≤j≤n。

//計算最大子段和的動態規劃演算法

#define num 1001

int a[num]

;int

maxsum

(int n)

return sum;

}

計算最大子段和的動態規劃演算法的最優解

①令besti,bestj為最大子段和sum的起始位置和結束位置;

②在當前位置i,如果b[i-1] ≤0時,在取b[i]=a[i] 的同時,儲存該位置i到變數begin中,顯然:

i.當b(i-1)≤0時,begin=i;

ii.當b(i)≥sum時,besti=begin,bestj=i。

#define num 1001

int a[num]

;int

maxsum

(int n,

int&besti,

int&bestj)

if(b>sum)

//得到新的最優值時,更新最優解

}return sum;

}

0—1揹包問題問題:給定乙個物品集合s={1,2,3,…,n},物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。

i.如果物品不能被分割,即物品i要麼整個地選取,要麼不選取;

ii.不能將物品i裝入揹包多次,也不能只裝入部分物品i,則該問題稱為0—1揹包問題。

iii.如果物品可以拆分,則問題稱為揹包問題,適合使用貪心演算法。

①假設xi表示物品i裝入揹包的情況,xi=0,1。

i.當xi=0時,表示物品沒有裝入揹包;

ii.當xi=1時,表示把物品裝入揹包。

②約束方程:

④因此問題就歸結為找到乙個滿足上述約束方程,並使目標函式達到最大的解向量:

x=,⑤0—1揹包問題具有最優子結構性質,設所給0—1揹包問題的子問題:

⑥i≤k≤n的最優值為p(i,j)。

i.是揹包容量為j,可選物品為i,i+1,…,n時0-1揹包問題的最優值。

⑦則建立計算p(i,j)的遞迴式如下:

//物品數量的上限

#define cap 1500

//揹包容量的上限

int w[num]

;//物品的重量

int v[num]

;//物品的價值

int p[num]

[cap]

;//用於遞迴的陣列

//形參c是揹包的容量w,n是物品的數量

void

knapsack

(int c,

int n)

p[1]

[c]=p[2]

[c];

//計算最優值

if(c>=w[1]

) p[1]

[c]=

max(p[1]

[c], p[2]

[c-w[1]

]+v[1]);}

//計算0-1揹包問題的最優解

void

traceback

(int c,

int n,

int x)

} x[n]

=(p[n]

[c])?1

:0;}

演算法設計與分析 動態規劃

分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...

演算法設計與分析之動態規劃

include void main system pause 用陣列實現斐波那契函式 include include intmain int i 0 for i 2 i 20 i for i 0 i 20 i system pause return0 遞迴實現斐波那契函式 include intfi...

C C 演算法分析與設計 動態規劃(採藥)

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採...