算法分析与设计(work7)

1、问题

设m万元钱,n项投资,函数 fi (x)表示将x万元投入第i项项目所产生的效益,i=1,2,...,n.问:如何分配这 m 元钱,使得投资的总效益最高?

2、解析

(dp[i][j]) 表示用(j)万元投入到前(i)个项目中可以获取的最大收益。

很显然,首先考虑转移方程,对于前(i)个项目的最大收益一定是从前(i-1)个项目的最大收益转化而来。那么可以枚举第(i)个项目所投资金额,设其为(x),那么其收益就是(f_{i}(x)),那么我们就可以推出转移方程 (dp[i][j]=dp[i-1][j-x]+f_{i}(x)(x<=j))

方程不断转移最后 (dp[n][m]) 即是最大收益。

3、设计

for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
        for(int k=j;k>=1;k--){
            dp[i][j]=max(dp[i][j],dp[i-1][j-k]+f[i][k]);
        }
    }
}

4、分析

需要枚举所有用(j)万元投入到前(i)个项目中的状态,时间复杂度(O(nm)),对于每个状态下,我们需要枚举第(i)个项目的投资数量进行转移,时间复杂度(O(m)),因此,总时间复杂度(O(nm^2))

5、源码

github源码地址:
https://github.com/HaHe-a/Algorithm-analysis-and-design-code/blob/master/Investment issues.cpp

越自律,越自由
原文地址:https://www.cnblogs.com/ha-chuochuo/p/14704259.html