【问题标题】:How can I write a Java code that solves this problem by using a design a greedy algorithm?我如何编写一个通过设计贪心算法来解决这个问题的 Java 代码?
【发布时间】:2019-02-13 19:16:36
【问题描述】:

问题:

你要去长途旅行。您从 0 英里路段开始上路。沿途有 n 家酒店,编号为 1 ≤ i ≤ n,英里路段 a 1

有谁知道我如何编写一个使用贪心算法来解决这个问题的 Java 代码?

我已经拥有的是:

public static void greedy(int[] a) {
    int[] hotel = a;
    int[] cost = new int[hotel.length];
    int[] stop = new int[hotel.length];

    int dist = 0;

    for (int i = 0; i < hotel.length - 1; i++) {
        dist = a[i + 1] - a[i];
        cost[i] = (int) (Math.pow((200 - hotel[i]), 2));
        stop[i] = 0;
    }
}

但我不知道从这里去哪里..

【问题讨论】:

  • 1.从一个具体的例子开始。 2. 手动“执行”示例,记下您执行的每个步骤。 3. 尝试编写代码来执行您手动执行的每个步骤。 4. 继续编写代码,直到它给出与您手动得到的相同的答案。 5. 用更多的例子进行测试。
  • 对于解决方案仅限于greedy的惊人相似问题,请参阅Long trip, cheap hotels
  • 200 miles 是一日游的硬上限吗?

标签: java algorithm greedy


【解决方案1】:

据我所知,您需要覆盖的总距离是a(n)。由于我们必须住在最后一家酒店,所以我想提出一个反向模式的贪婪解决方案。

如果a(n) - a(n-1) 不能大于200 英里。所以我想选择一家酒店a(i),它位于a(n)a(n) - 200 之间。现在我们正在考虑一种贪婪的方法,您需要选择那家酒店并将这家酒店保存在您的访问列表中。

现在,从那里继续前进,选择距离在a(i)a(i) - 200 之间的下一家酒店,依此类推,直到到达起点。

我没有编写任何代码,因为我认为这是家庭作业。不过,我想你明白了。希望有帮助!祝你好运。

【讨论】:

    【解决方案2】:

    不要继续前进并立即开始编码:从分析任务开始

    贪婪意味着采取最好的下一步从不回头看;前瞻性限制或不允许)。
    设 dₓ 为第 x 天的距离,看看 150、200、250 英里处的酒店:
    - 如果成本是 200-dₓ,
    总成本为 150,第一个距离为 200 以及 150
    - 如果成本是 (200-dₓ)²,
    总成本是 22500,第一个距离是 200,只有 12500 和 150:
    每个绝对差异都尽可能接近所有其他差异
    - 没有(完全)前瞻,你不会知道所有剩余的:
    下一个差异尽可能接近预期平均剩余
    - 在所有其他条件相同的情况下,您最好少一日游而不是多一日游
    - 前瞻为1,单日游费用为50,2500成为一种选择。


    how I can write a Java code that solves this problem?
    重新审视贪婪并考虑一个(更多)示例(与往常一样):

    • 不要写下算法(还):
    • 认真考虑测试解决方案
      如果不在分析中,任务定义问题必将变得明显的地方: 200 miles 是上限吗? (我可以切换方向吗?)
      编写测试代码,使其检查示例任务和结果。 让它标记错误结果(仅)。
    • 然后才开始草拟解决方案。
      习惯性地,我在这里绕道/走捷径:
      我开始一个源文件(或继续进行测试),并使用所选编程工具的文档约定(使用 Java,即doc comments)来完成任务的描述。
      我草拟了解决方案,在语法上是一个易于拆分的 cmets(Java:// line cmets)
    • 检查草拟的解决方案:是否有任何简化建议?
      如果它看起来很复杂:是否可以取消限制以允许更简单的方法得到相同的结果?
      最终,首先实施该方法可能会节省时间,即使重新审视已取消的限制会导致拒绝将其作为解决方案。
      (在这里,Daniele's suggestion 值得一试如果您的方法看起来明显更复杂。)
    • 有了可维护的做什么描述如何,你就可以开始编码了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2020-07-25
      相关资源
      最近更新 更多