动态规划求解投资问题

动态规划求解投资问题

1. 问题

在这里插入图片描述

2. 解析

在这里插入图片描述
在这里插入图片描述

3. 设计

	//给F[0][0-m]赋值
       for (j from 0 to m)
       {
              F[0][j] = f[0][j];//第一个项目上投入0 to m元钱的最大收益等于f[0][0 to m]
       }
       for (遍历n个项目)
       {//项目循环,从1开始,也就是从前2个项目开始算,因为第一个项目已经赋值
              for (遍历m元钱)
              {//钱数循环从0开始
                     for (k = 0; k <= j; ++k)
                     {
                           //F[i][x],将x元钱投入到前i个项目上最大的收益
                           tmp_F = F[i - 1][j -k] + f[i][k];
                            if (tmp_F >F[i][j])
                                   F[i][j] = tmp_F;                      
                     }
              }
       }

4. 分析

在这里插入图片描述

5.源码

https://github.com/Bacsonlx/Algorithm-analysis

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
最优投资分配问题可以使用动态规划算法进行求解。以下是一个使用Java语言实现的代码示例: ```java public class InvestmentAllocation { public static void main(String[] args) { // 投资方案 int[] plans = {1, 2, 3, 4, 5}; // 投资方案对应的收益率 double[] rates = {0.1, 0.2, 0.3, 0.4, 0.5}; // 投资总金额 double totalAmount = 1000000.0; // 初始化动态规划数组 double[][] dp = new double[plans.length + 1][(int) totalAmount + 1]; for (int i = 0; i <= plans.length; i++) { dp[i][0] = 0.0; } for (int j = 0; j <= totalAmount; j++) { dp[0][j] = 0.0; } // 动态规划求解 for (int i = 1; i <= plans.length; i++) { for (int j = 1; j <= totalAmount; j++) { if (j < plans[i - 1]) { dp[i][j] = dp[i - 1][j]; } else { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - plans[i - 1]] + plans[i - 1] * rates[i - 1]); } } } // 输出结果 System.out.println("最优投资收益为:" + dp[plans.length][(int) totalAmount]); } } ``` 其中,动态规划数组`dp[i][j]`表示前`i`个投资方案,总投资金额为`j`时的最优收益。状态转移方程为: ``` dp[i][j] = max(dp[i-1][j], dp[i][j-plans[i-1]] + plans[i-1]*rates[i-1]) ``` 其中`plans[i-1]`和`rates[i-1]`分别表示第`i`个投资方案的金额和收益率。如果投资金额`j`小于当前方案的金额,那么最优收益就是前`i-1`个投资方案的最优收益;否则,最优收益就是前`i-1`个投资方案的最优收益和当前方案的收益之和。最终的最优收益为`dp[plans.length][(int) totalAmount]`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林北山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值