实验报告
课程名称 《算法分析与设计》
实验名称 投资问题
1.问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
设 m 万元钱,n 项投资,函数f(x) 表示将 x 万元投入第 i 项项目所产 生的效益,i=1,2,…,n.问:如何分配这 m 元钱,使得投资的总效益最高?
问题实例:
5万元,投资给4个项目,效益函数:
fi(x)表示第i个项目投资x万的钱得到的效益。
x | f1(x) | f2(x) | f3(x) | f4(x) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 11 | 0 | 2 | 20 |
2 | 12 | 5 | 10 | 21 |
3 | 13 | 10 | 30 | 22 |
4 | 14 | 15 | 32 | 23 |
5 | 15 | 20 | 40 | 24 |
2.解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
假设分配给第 i 个项目的钱数是 xi,问题描述为:
目标函数:max{f1(x1)+f2(x2)+…+fn(xn)}
约束条件:x1+x2+…+xn=m,xi∈N;
设Fk(x)表示x元投给前k个项目的最大效益,k=1,2,…,n,x=1,2,…,m
递推方程:Fk(x)=max{fk(xk)+Fk-1(x-xk)}(0≤xk≤x),k=2,3,…,n
边界条件:F1(x)=f1(x),Fk(0)=0,k=1,2,…,n
Fi[x]表示投资共i个项目总金额为x时能得到的最大效益。
Fi[0]=0;(对于任意i,1<=i<=4)
递推
- F1[5]=max(f1[0]+F0[5],f1[1]+F0[4],f1[2]+F0[3],f1[3]+F0[2],f1[4]+F0[1],f1[5]+F0[0])=11;
- F2[5]=max(f2[0]+F1[5],f2[1]+F1[4],f2[2]+F1[3],f2[3]+F1[2],f2[4]+F1[1],f2[5]+F1[0])=26;
- F3[5]=max(f3[0]+F2[5],f3[1]+F2[4],f3[2]+F2[3],f3[3]+F2[2],f3[4]+F2[1],f3[5]+F2[0])=43;
- F4[5]=max(f4[0]+F3[5],f4[1]+F3[4],f4[2]+F3[3],f4[3]+F3[2],f4[4]+F3[1],f4[5]+F3[0])=61;
x | F1[x] | F2[x] | F3[x] | F4[x] |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 11 | 11 | 11 | 20 |
2 | 12 | 12 | 13 | 31 |
3 | 13 | 16 | 30 | 33 |
4 | 14 | 21 | 41 | 50 |
5 | 15 | 26 | 43 | 61 |
3.设计
[核心伪代码]
For k=1,2,…,n //第k个项目
For x=0,1,2,…,m //k个项目共分配x元
For xk=0,1,2,…,x //第k个项目分配xk
Fk(x)=max{fi(xk)+Fk-1(x-xk)}//递推公式
4.分析
[算法复杂度推导]
枚举项目需要n,枚举状态需要m,枚举决策需要m,因此总复杂度为O(nm^2)