1.问题
投资问题
- 一般性描述:
设m元钱,n 项投资,函数 表示将 x 元投入第 i 项项目所产生的效益,i=1,2,…,n. 问:如何分配这m元钱,使得投资的总效益最高? - 组合优化问题:
假设分配给第 i 个项目的钱数是 xi,问题描述为:
2.解析
递推公式
设 Fk (x)表示 x 万元投给前 k 个项目的最大效益,k=1,2,…,n,x=1,2,…,m
说明:第 k 步,前后共分配 x 万元,
- 分配给第 k 个项目为 xk
- x-xk 万元,分配给前 k-1 个项目
证明满足优化原则
优化原则:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状 态的最优决策序列。
已知:这个序列 L1 是最优决策序列
那么:这个序列任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序
列。
证明(反证法)
- 模板:
假设这个序列任一个子序列 s1 本身一定不是相对于子序列的初始和结束状态的最优
决策序列。 那么根据假设,必然存在另外一个子序列 s2 优于一个子序列 s1,并且两个子序列相
对于子序列的初始和结束状态一致。 将 L1 中原子序列 s1 替换为 s2,获得 L2,因为 s2优于 s1,必然 L2 优于 L1,这与 L1 是最优决策序列矛盾(已知),因此假设错误,得证。
3.设计
xi(x)=k:新加第i项时,总共分配x元时,第i项分配了k元(xk)
核心伪代码
for (int i = 1; i <= m; i++) //第k个项目
for (int j = 0; j <= n; j++) //k个项目共分配x万元
for (int k = 0; k <= j; k++) //第k个项目分配Xk
if (f[i][k] + F[i - 1][j - k] > F[i][j]) {
F[i][j] = F[i - 1][j - k] + f[i][k];
X[i][j] = k;
}
4.分析
最后推导出算法时间复杂度为O(nm²)