文章目录
1. 投资问题建模
1.1 问题:
m元钱,n项投资,fi(x):将x元投入第i个项目的效益 (题目会给),求使得总效益最大的投资方案
1.2 建模
问题的解:向量<x1,x2,…,xn>
xi 的意思是:投给项目i的钱数
目标函数:max{f1(x1) + f2(x2) + … + fn(xn)}
约束条件:x1 + x2 + … + xn = m
1.3 动态规划算法
整体思想:知道给前n-1个项目如何最大效益投资之后,再决定如何投第n个项目
1.3.1 参数设定及运算顺序
- 设定参数k和参数x
k: 考虑对项目1,2,…,k的投资
x:投资总钱数不超过x
那么我们就是要计算 k = n 的时候,x = m的时候,让效益最大
- 为了子问题能够被后面的大的子问题重复利用,我们要确定子问题的计算顺序:从只投资一个项目,到投资n个项目;对于投资的这么多项目,钱数从0到m
1.3.2 优化函数的递推方程
设定函数Fk(x):x元钱投给前k个项目的最大效益
递推方程为:
- Fk(x) = max{fk(xk) + Fk-1(x - xk)}
- 即:
投资前k个项目且不超过x元钱的最大效益 = 拿xk元钱投资第k个项目加上投资前k-1个项目且该前面k-1个项目的钱不超过x - xk
- 即:
- F1(x) = f1(x)
1.3.3 实例
- k = 1 时
F1(1) = f1(1) = 11
F1(2) = f1(2) = 12
F1(3) = f1(3) = 13
F1(4) = f1(4) = 14
F1(5) = f1(5) = 15 - k = 2 时
- x = 1
注意:这里省略了一些数学项,图上容易误导,实际上按照算法的思想应该为:F2(1) = max{f2(1) + F1(0),f2(0) + F1(1)},而省略的那些项就为0,所以算法里也直接没写,备忘录也没有写;下面的图一样省略了 - x = 2
- 按照这个计算顺序也刚好可以验证:可以 重复利用前面子问题的结果
- x = 3
- 类似计算F2(4) = 21,F2(5) = 26
- x = 1
- k = 3
- x = 1
- …
- x = 4
F3(4) = max{f3(4) + F2(0),f3(3) + F2(1),f3(2) + F2(2),f3(1) + F2(3),f3(0) + F2(4)}
1.3.3.1 备忘录与解
- xk(x) 的值代表此时给第k个项目投了多少钱
- 比如表格中x2(2) = 0 代表当 k = 2,x = 2时,给最后一个项目投了0元钱
求解
先从右下角开始求
-
x5 = 1 即 x4 = 1,第4个项目投1万元
-
这时x3(5 - 1) = x3(4),看表格中 k = 3,x = 4
此时x3(4) = 3,也就是给第3个项目投3万元 -
…
-
求出
1.3.4 时间复杂度分析
通过递推方程分析
Fk(x) 要计算x + 1次加法、x次比较
即
W(n) = O(nm2)