问题
设m元钱,n项投资.效益函数fi(x)表示将x元投入第i个项目所产生的效益, i=1,2,3,…,n。问:如何分配这m元钱,使得投资的总效益最高?
解析
- 递推公式。设Fk(x)表示x万元投给前k个项目的最大收益,k=1,2,…,n, x=1,2,…,m
我们可以得到递推方程和边界条件:
递推方程:Fk(x)=max0≤xk≤x{fk(xk)+Fk−1(x−xk)},k=2,3,…,n
边界条件:Fk(x)=max0≤xk≤x{fk(xk)+Fk−1(x−xk)},k=1,2,…,n
第k步,前后共分配x万元,分配给第k个项目为xk;x-xk万元分配给前k-1个项目。 - 证明满足优化原则
优化原则:
一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。 - 初步分析可以知道:
第一个项目: 投资第一个项目的钱不超过x最大收益就是f1(x)。
第二个项目: 第二个投资F2(x)是当xk元钱投资给第二个项目得到的效益加上x−xk元钱投资给前一个项目的最优,然后再在这里面取最大值。
……
第n个项目: 第n个投资Fn(x)是当xk元钱投资给第n个项目得到的效益加上x−xk元钱投资给前n−1个项目的最优,然后在这里面取最大值。
设计
核心代码:
void invest(){
int i,j,k,t;
for(k=2;k<=n;k++){
memset(F[k],-