实验报告
课程名称 《算法分析与设计》 实验日期 2021 年 4 月 25 日 至 2021 年 4 月 25日
学生姓名 石晨昊 所在班级 计算机194 学号 2019212212322
实验名称 投资问题
实验地点 同组人员
1.问题
一般性描述:设m元钱,n项投资项目,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,···,n;
问:如何分配这m元钱,使得投资总效益最高?
组合优化问题:假设分配给第i个项目的钱数是xi,
目标函数:max{f1(x1)+ f2(x2)+···+ fn(xn)};
约束条件:x1+x2+x3+···+xn=m,xi∈n;
2.解析
优化函数的递推方程: Fk(x)表示的意思是 把 x 元 投资给 前 k 个项目 获得的最大收益。
x的范围(投资的总的钱数) 是0 到 x
k 的范围是 1 到 n (总共有 n 个项目)
那么 Fk(x) 的值应该是 对 第k个项目投资 了 xk 元 后的收益 + 把剩下的钱(x-xk)投给 前 k-1个项目的总的收益 Fk-1(x-xk)
那么,这个 xk的值 可以从 0 到 x,就是说,可以一分钱也不投资给 第k个项目,也可以把所有钱都投资给 这个项目,所以,这里要遍历 x+1次 才可以获得收益的最大值。
3.设计
int maxprofit(int dp[M][N],int f[M][N],int money,int number)
{
for (int i=1;i<=number;i++)
{
for (int j=0;j<=money;j++)
{
dp[i][j]=0;
for (int k=0;k<=j;k++)
{
if (dp[i][j]<f[i][k]+dp[i-1][j-k])
dp[i][j]=f[i][k]+dp[i-1][j-k];
}
}
}
return dp[number][money];
}
4.分析
时间复杂度: O(nm2)
5.源码
https://github.com/695950719/Algorithm-design/blob/main/lab7-%E6%8A%95%E8%B5%84%E9%97%AE%E9%A2%98.cpp