最大子段和問題
① 給定由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 演算法分析與設計 動態規劃(採藥)
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採...