首页 > 代码库 > 算法学习——动态规划2

算法学习——动态规划2

投资问题:

问题描述:有m元钱,投资给n的项目,f(x): 将x元投入到第i个项目中的效益。求使得总效益最大的投资方案。(这道题太不容易了,这是我第一次没有看答案做出了动态规划的问题,应该是花了三个小时)。

建模:问题的解是向量<x1,x2,xn>

目标函数:max{f1(x1)+f2(x2)+fn(xn)}

 

对于子问题的划分和计算顺序:

k:考虑对于项目1,2,,,k的投资

x:总钱数不能超过x

 

原始输入,k=n ,x=m

k=1到n

x=1到m

假设有一个五万元的可以投资在四个项目上面,投资回报表格如下:

技术分享

 

有关动态规划初学者代码心得:

1.对于动态规划中的备忘录,也就是所谓的存储的数据结构经常会以矩阵的形式应用,有时输入也会存在矩阵:

对于矩阵来讲,最重要的:一定要搞清row和column的意义!一定要搞清row和column的意义!一定要搞清row和column的意义!重要的事情说三遍!!!

例如:在这个问题中变用于存储子结果的矩阵dp[投资的金额][所投资的项目]

2. 初始化备忘录的时候一定要加入之后进行计算时所有可能用到的项目,在此题中f(0)这一列也会在后面计算中用到所以要加入dp的备忘录中

3. 状态转移方程不仅在数值上有存在关系,在备忘录的下标中也存在关系:比如:max = dp[j-k][i-1]+item[k][i]

 

对于该问题的解法:

1.备忘录表中有row行,column列,行代表投资的钱数,列代表总计需要投资的项目,总计row*column项

技术分享

xk有x+1种可能的取值,计算F[K][x](2<=k<=n, 1<=x<=m)需要:

x+1次加法

x次比较

 

以下表格为通过动态规划生成的备忘录: 

技术分享

 

 投资问题的动态规划:

1.用两个不同类型的参数界定子问题

2.列出优化函数的递推方程以及初值

3.确定子问题计算顺序

4.计算时间复杂度

 

参考代码: 

技术分享

 

算法学习——动态规划2