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 时
    1. x = 1
      在这里插入图片描述
      注意:这里省略了一些数学项,图上容易误导,实际上按照算法的思想应该为:F2(1) = max{f2(1) + F1(0),f2(0) + F1(1)},而省略的那些项就为0,所以算法里也直接没写,备忘录也没有写;下面的图一样省略了
    2. x = 2
      在这里插入图片描述
      • 按照这个计算顺序也刚好可以验证:可以 重复利用前面子问题的结果
    3. x = 3
      在这里插入图片描述
    4. 类似计算F2(4) = 21,F2(5) = 26
  • k = 3
    1. x = 1
    2. 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元钱

求解
先从右下角开始求

  1. x5 = 1x4 = 1,第4个项目投1万元
    在这里插入图片描述

  2. 这时x3(5 - 1) = x3(4),看表格中 k = 3,x = 4
    在这里插入图片描述
    此时x3(4) = 3,也就是给第3个项目投3万元

  3. 求出
    在这里插入图片描述

1.3.4 时间复杂度分析

通过递推方程分析
在这里插入图片描述
Fk(x) 要计算x + 1次加法、x次比较

在这里插入图片描述
W(n) = O(nm2)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐