【问题标题】:Determine Maximum Profit Algorithm C++确定最大利润算法 C++
【发布时间】:2021-11-20 02:04:53
【问题描述】:

考虑以下问题:

Searcy Wood Shop 的世界著名摇椅(每个订单 1 把)的订单积压。制作一把椅子所需的总时间为 1 周。但是,由于椅子在不同的地区和不同的市场销售,每个订单的利润金额可能会有所不同。此外,每个订单都有一个截止日期。公司只有在截止日期前才能赚取利润;否则,利润为 0。 编写一个程序来确定最大化利润的订单的最佳时间表。

测试用例的第一行将包含一个整数 n (0 ≤ n ≤ 1000),表示待处理订单的数量。 n 的值为 0 表示输入文件的结尾。 接下来的 n 行每行包含 3 个正整数。第一个整数 i 是订单号。给定测试用例的所有订单号都是唯一的。第二个整数表示从现在到订单号 i 的截止日期的周数。第三个整数表示如果订单号 i 在截止日期前,公司将获得的利润金额。

示例输入:

7
1 3 40
2 1 35
3 1 30
4 3 25
5 1 20
6 3 15
7 2 10
4
3054 2 30
4099 1 35
3059 2 25
2098 1 40
0

输出:

100
70

输出将是测试用例输入的最佳总和。

我遇到的问题是我一直在努力想出一个始终找到这个最优总和的算法。

我的第一个想法是,我可以简单地逐周检查每个输入,然后选择该周利润最高的椅子。但是,如果一周有两把椅子的利润都高于前一周,这不起作用。

我的下一个想法是,我可以按照利润从高到低的顺序排列列表。然后我会从利润最高的列表中遍历列表,并将当前条目与下一个条目进行比较,然后选择周数较低的条目。

这些都不是始终如一的工作。谁能帮帮我?

【问题讨论】:

    标签: c++ algorithm greedy


    【解决方案1】:

    我将首先按第二列(截止日期前的周数)按升序对列表进行排序,然后按降序对第三列(利润)进行排序。

    例如,在您的文件中:

    2098 1 40
    2 1 35
    4099 1 35
    3 1 30
    5 1 20
    3054 2 30
    3059 2 25
    7 2 10
    1 3 40
    4 3 25
    6 3 15
    

    在相同数量的周订单中,我将执行最高利润。如果截止日期是 1 周 - 最高订单; 2 周 - 2 个最高订单,3 周 - 3 个最高订单,依此类推。

    【讨论】:

      【解决方案2】:

      首先,您必须考虑哪些订单有资格在“第 i”天完成,即截止日期大于或等于 i 的所有订单。因此,只需按截止日期的递减顺序迭代所有订单。

      假设最后期限周是“x”,然后将“x”周的所有利润值推送到优先队列中。推送值的最大值将是您在“x”周的最佳利润。现在从优先级队列中删除选定的利润并将其添加到您的答案中。剩余的值仍然可以在前几周使用,现在将截止日期为“x-1”的利润值添加到优先级队列中,并从中取出最大值并重复直到截止日期周变为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        相关资源
        最近更新 更多