投資問題
設m元錢,n項投資,函式f[i][x]表示將x元投入第i項專案所產生的效益,i=1,2,…,n.問:如何分配這m元錢,使得投資的總效益最高?
遞推公式:
設f[k][x]表示x萬元投給前k個專案的最大效益,k=1,2,…,n,x=1,2,…,m
遞推方程:f[k][x]=max , 0<=j<=x , k=1,2,…,n
邊界條件:f[1][x]=f[1][x] , x=0,1,…,m ; f[k][0]=0 , k=1,2,…,n
說明:第k步,共分配x萬元
① 其中分配給第k個專案為j萬元;
② 分配給前k-1的專案為x-j萬元。
滿足優化原則:
優化原則:乙個最優決策序列的任何子串行本身一定是相對於子串行的初始和結束狀態的最優決策序列。
已知:這個序列l1時最優決策序列
那麼:這個序列任何子串行本身一定是相對於子串行的初始和結束狀態的最優決策序列。
1 #include2 #include3 #include4
using
namespace
std;
5const
int maxn=100+10;6
const
int maxm=1000+10;7
int f[maxn][maxm]; //
f[i][j], 表示j元投資給前i個專案的最大收益
8int val[maxn][maxm]; //
val[i][j],表示投資第i件j元的收益
9int x[maxn][maxm]; //
x[i][j],表示在總共分配j元時, 取得最大效益時分配給第i個專案的錢數
10int n,m; //
n件物品,總投資m元
11int
main()18}
19for(int i=1;i<=n;++i)
2627}28
}29} 30
for(int i=1;i<=m;++i)
34 printf("\n"
);35
}36 printf("
最大收益為:%d\n
",f[n][m]);37}
38/*
394 5
400 0 0 0
4111 0 2 20
4212 5 10 21
4313 10 30 22
4414 15 32 23
4515 20 40 24
46*/
k∈[0,j],共j+1項,f[i][k]+f[i-1][j-k]有j+1項,因此有j+1次加法,j+1項比較出最大值。
for i = 1 ~ n
for j = 0 ~ m
for k= 0 ~ j
加法與比較的複雜度均為(n-1)m(m+3)/2.
因此該演算法時間複雜度為o(n·m^2)
演算法分析與實踐 作業5
在包含有n個點的集合s中,找出距離最近的兩個點。設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面的n個點。嚴格地講,最近點對可能不止一對,此例輸出一對即可。利用分治求解 首先對所有的點按照x座標 或者y 從小到大排序 排序方法時間複雜度o nlogn o nlogn o nlogn ...
演算法分析與實踐 大作業
給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的原序列。一般而言我們會想到這種做法 但是這種只是其中一種,我們並沒有考慮完全,還有一些如 小球本來可以放到兩個大球的中間,不增加長度的 這個就類似於最短路的問題,由此我們想到了回溯演算法。開始時設a r1,r2,rn ...
演算法分析與實踐 作業13
讀後感 由於參與了我院acm實驗室的緣故,我有幸閱讀了 演算法競賽 高階指南 這本書。儘管並沒有能完全地滲透這一本書,但是還是在這本書上學習一些比較有用的演算法。演算法可以說是基礎,很多問題倘若我們使用暴力的方法去解決,複雜度甚至可以達到o n 但是當我們使用了一些演算法去優化,複雜度可以降到o n...