投资问题

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²)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值