P40 投资问题
动态规划解决投资问题的例子。
由于公式输入比较麻烦,比较简单容易理解的直接采用老师的ppt或者采用手写方式。
投资问题描述:
一个问题实例
我的分析
java实现
//投资问题
//问题描述:m万元钱,n项投资,fi(x):将x元投入第i个项目的效益。求使得总效益最大的投资方案
//输入:m,和n,以及n个项目的投资收益表;f[n][m+1] 都从下标1开始,f[1][2]代表给第1个项目投资2万元
public void investmentIssues(int[][] f, int m,int n) {
int[][] r = new int[n+1][m+1];
int[][] s = new int[n+1][m+1];
//k代表投资前k个项目
for (int k = 1; k <= n; k++) {
//i代表投资前k个项目 不超过i万元钱
for(int i = 1; i <= m; i++) {
//j代表投资第k个项目j万元钱
for(int j = 0; j <= i; j++) {
//r[k-1][i-j]代表投资第k-1个项目i-j元钱所能收获的最大效益,f[k-1][j]代表投资第k个项目j元钱带来的效益
//因为数组下标从0开始,所以k-1;
int temp = r[k-1][i-j] + f[k-1][j];
if(temp > r[k][i]) {
r[k][i] = temp;
s[k][i] = j;
}
}
}
}
getInvestmentIssues(f, m, n, r, s);
}
private void getInvestmentIssues(int[][] f, int m, int n, int[][] r, int[][] s) {
System.out.println("投资前" + n + "个项目" + m + "元钱的最大收益是" + r[n][m] + ",投资第" + n + "个项目的钱是:" + s[n][m]);
if(n == 0 || m == 0) {
return;
}
getInvestmentIssues(f, m - s[n][m], --n, r, s);
}
老师的分析
略过了问题建模
第二步子问题界定和第四步计算顺序的确定
第三步优化函数的递推方程
实例计算F(1,x)的各个最优效益。指投资前1个项目,x元钱的最大效益。
k=2,时的最大效益
得出解的备忘录
时间复杂度的分析