問題
設m元錢,n項投資.效益函式fi(x)表示將x元投入第i個專案所產生的效益, i=1,2,3,…,n。問:如何分配這m元錢,使得投資的總效益最高?
解析遞推公式。設fk(x)表示x萬元投給前k個專案的最大收益,k=1,2,…,n, x=1,2,…,m
我們可以得到遞推方程和邊界條件:
遞推方程:fk(x)=max0≤xk≤x,k=2,3,…,n
邊界條件:fk(x)=max0≤xk≤x,k=1,2,…,n
第k步,前後共分配x萬元,分配給第k個專案為xk;x-xk萬元分配給前k-1個專案。
證明滿足優化原則
優化原則:
乙個最優決策序列的任何子串行本身一定是相對於子串行的初始和結束狀態的最優決策序列。
初步分析可以知道:
第乙個專案: 投資第乙個專案的錢不超過x最大收益就是f1(x)。
第二個專案: 第二個投資f2(x)是當xk元錢投資給第二個專案得到的效益加上x−xk元錢投資給前乙個專案的最優,然後再在這裡面取最大值。
……第n個專案: 第n個投資fn(x)是當xk元錢投資給第n個專案得到的效益加上x−xk元錢投資給前n−1個專案的最優,然後在這裡面取最大值。 設計
核心**:
void
invest()
for(k=
0;k<=m;k++
)for
(k=2
; k<=n;k++)}
}}for(i=
0;i<=n;i++
)printf
("\n");
}printf
("%d\n"
,f[n]
[m])
;}
分析
xk共有x+1項,fk(xk)+fk-1(x-xk)也有x+1項,所以有x+1次加,x項比較出最大值。另外,還有兩重for迴圈,所以複雜度為o(nm2)。
github原始碼
在這
演算法分析與設計作業7 動態規劃 投資問題
設m元錢,n項投資,函式fi x 表示將x元投入第i個專案所產生的效益 i 0,1,2,3 n 問 如何分配這m元錢,使得投資總效益最高?將這個問題分割開看,將一部分資金x元分割給第k個專案,那麼剩下k 1個專案分得資金m x元,零gk x 表示將資金x分給前k個專案的最大利潤,則求max fk x...
作業7 投資問題
這裡可以採用動態規劃的思想,我們建立 a儲存狀態,橫座標為累計投資x,縱座標為專案i。有函式g x i表示當前格最大收益 當i為1時我們有g x 1 f x 1 接下來我們動態規劃,有g x i max y 0 x 就可以逐步畫出整個 偽函式 三個二維陣列a,b,c 輸入 存入a 用a的第一列初始化...
演算法分析設計實踐 投資問題
設m元錢,n項投資,函式fi x 表示將x元投入第i項專案所產生的相依 i 1 2 n 問 如何分配這m元錢,使得投資的總效益最高。1.我們設dp i j 為前i個專案花費j元所能得到的最大收益 2.假設我們分配個第i個專案k元,那麼實際上前i 1個專案一共得到了j k元 因此 dp i j 的最優...