计算最大利润的代码

Posted

技术标签:

【中文标题】计算最大利润的代码【英文标题】:Code for calculating max profit 【发布时间】:2016-10-06 05:59:37 【问题描述】:

最近我在 IARCS 网站上遇到了this 问题。

我解决这个问题的方法是,Ramu 必须在某一天交易或什么都不做,因为他只能养 1 头水牛,如果他有 1 头水牛,他必须卖掉,如果没有,他必须买。如果我可以计算所有可能的组合,我可以很容易地确定他的最高利润。但是我的代码似乎无法正常工作,它提供的输出比预期的要高一些,并且有时会卡在更大的测试用例中,在尝试了 3 天之后,有人可以指导我走正确的道路吗?

这是我的代码:

#include <iostream>

int bestTrade(int arr[], int size, bool toTrade, int visits, int day) 
  if (day < size - 1) 
    day = day + 1;
    if (visits > 0) 
      if (visits % 2 == 0) 
        int visitsT = visits - 1;
        int trade = bestTrade(arr, size, true, visitsT, day) - arr[day];
        int nothing = bestTrade(arr, size, false, visits, day);
        if (nothing > trade) 
          return nothing;
         else 
          return trade;
        
       else 
        int visitsT = visits - 1;
        int trade = bestTrade(arr, size, true, visitsT, day) + arr[day];
        int nothing = bestTrade(arr, size, false, visits, day);
        if (nothing > trade) 
          return nothing;
         else 
          return trade;
        
      
     else 
      return 0;
    
   else 
    return 0;
  

int main(int argc, char const* argv[]) 
  int n, k;
  std::cin >> n >> k;
  int market[n];
  for (int i = 0; i < n; i++) 
    std::cin >> market[i];
  
  k = (k / 2) * 2;
  int maxProfitT = bestTrade(market, n, true, k--, 0);
  int maxProfitN = bestTrade(market, n, false, k, 0);
  if (maxProfitN > maxProfitT) 
    std::cout << maxProfitN << std::endl;
   else 
    std::cout << maxProfitT << std::endl;
  
  return 0;

【问题讨论】:

我通过重新格式化程序运行了您的代码以使其更具可读性:format.krzaq.cc 您应该考虑使用其中列出的样式之一。 cmets 也.. 堆栈溢出是为了询问具体问题而不是“我有点迷路”。如果您有具体问题,请提出,但这可能会因为过于宽泛而被关闭。 什么意思?我已经提供了 看看这个链接。它可能会帮助你。 geeksforgeeks.org/… 【参考方案1】:

关于dynamic programming的任何问题,可以这样想:

如果您知道截至(i-1)th 日最多k 笔交易的最大利润,您能否算出截至ith 日最多k 笔交易的最大利润?

想想……答案是Yes!!!!

比如说,在(i-1)th 之前最多k 交易的最大利润是best(k,i-1)。您需要找出best(k,i) 来获取任何i&lt;n

如果您选择在i-th 日不进行任何交易,则best(k,i)best(k,i-1) 相同。如果你确实想做一笔交易,那么best(k,i) = max(value[i] - value[j] + best[k-1][j]), j from 0 to i`

所以,最后DP 公式变成了:

best[k][i] = max(best[k][i-1], max(value[i] - value[j] + best[k-1][j]), j&lt;i)

对于工作代码,您可以查看here

希望对你有帮助!!!

【讨论】:

谢谢伙计,在我花了几个小时在笔记本上工作并通过绘制表格浪费页面之后,它完成了我的工作。

以上是关于计算最大利润的代码的主要内容,如果未能解决你的问题,请参考以下文章

2021-07-06:股票问题3。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(

data.frame 中每一列的利润回撤

2021-07-05:股票问题2。给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖

2021-07-07:股票问题4。给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成(

2021-07-08:股票问题5。给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票)

销售量服从泊松分布,怎样获取最大利润