如何使用设计贪婪算法编写解决此问题的Java代码



问题:

您将长途旅行。您从Mile Post 0的道路开始。沿途,有n个酒店,编号为1≤i≤N,在Mile Posts a 1<2<。。。<a n,每个a i均从起点进行测量。您唯一被允许停在这些酒店的地方,但是您可以选择您停在哪些酒店。您必须在最后的酒店(在A N)停留,这是您的目的地。理想情况下,您希望每天旅行200英里,但这可能是不可能的(取决于酒店的间距)。如果您一天中旅行X英里,那天的罚款是(200- x)2。您想计划旅行,以最大程度地减少所有旅行日的总罚款,每日罚款。

有人知道如何使用贪婪算法编写解决此问题的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;
    }
}

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

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

如果a(n) - a(n-1)不能大于200英里。因此,我想选择在a(n)a(n) - 200之间的某个地方中间的a(i)酒店。现在,当我们考虑采用一种贪婪的方法时,您需要选择该酒店并将这家酒店保存在您的访问清单中。

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

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

不要向前耕作,然后立即开始编码:开始分析任务

贪婪表示采取最好的下一步从不回头;返回;让Dₓ成为第X天的距离,并查看150、200、250英里的酒店:
- 如果成本为200-d,
总成本为150,第一距离为200,而150
- 如果成本是(200-dₓ)²,
总成本为22500,第一距离为200,只有12500,150:
您最好使用尽可能接近所有其他差异
- 如果没有(完整的)look-aead,您不知道都剩下:
接近预期的平均剩余的下一个差异
- 所有其他事物是平等的,您的一日游较少,而不是更多
- 以1为1的外观,成本为50和2500的单日旅行成为一种选择。


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

  • 不要写下算法(尚未):
  • 给予测试解决方案认真思考
    如果不是在分析中,是任务定义的问题势必会变得显而易见:200 miles是上限吗?(我可以切换方向吗?)
    编码测试,使其检查示例任务和结果。使其标记错误的结果(仅)。
  • 只有然后开始绘制解决方案。
    习惯性地,我在这里绕行/捷径:
    我启动了一个源文件(或继续使用测试的文件),然后使用选择的编程工具的文档惯例(使用Java)来完成该任务的描述,这将是Doc注释。

    我绘制解决方案,句法为表格中的注释很容易拆分(Java://行评论)
  • 检查解决的解决方案:是否有任何简化建议自己?
    如果看起来很复杂:可以放弃限制以允许更简单的方法给出相同的结果吗?
    最终可能会节省时间首先实施该方法,即使对限制的重新限制下降也导致拒绝它作为解决方案。
    (在这里,Daniele的建议值得一试,如果您的方法看起来明显更复杂。)
  • 可维护的描述如何,您可以编码

最新更新