算法分析与设计(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

posted @ 2021-04-26 13:32  hachuochuo  阅读(90)  评论(0编辑  收藏  举报