【问题标题】:Recursion to Find Cheapest Solution递归寻找最便宜的解决方案
【发布时间】:2015-03-19 14:19:10
【问题描述】:

我有这个问题要做:

使用递归编写一个函数来执行以下操作:您是一家小工厂的经理。你有 7 名工人和 7 份工作要做。每个工人被分配一份且只有一份工作。每个工人对每项工作都要求不同的报酬。 (例如:工人 Archie 要求焊接 10 美元,木工要求 15 美元等。工人 Jughead 要求焊接 12 美元,木工要求 5 美元等)找到最适合您的工作分配。

我创建了这八个关于每个工人的需求量的类: 一个可能不必要的超类

public class Workers
{
public int doCarpentry()
    {return 0;}
public int doWelding()
    {return 0;}
public int doMechanic()
    {return 0;}
public int doCleaning()
    {return 0;}
public int doDishes()
    {return 0;}
public int doPlumbing()
    {return 0;}
public int doCashier()
    {return 0;}       
}

其他七个都是这样的:

public class Jennifer extends Workers
{
public int doCarpentry()
    {return 10;}
public int doWelding()
    {return 10;}
public int doMechanic()
    {return 12;}
public int doCleaning()
    {return 12;}
public int doDishes()
    {return 8;}
public int doPlumbing()
    {return 9;}
public int doCashier()
    {return 10;}       
}

public class Linda extends Workers 
{
public int doCarpentry()
    {return 9;}
public int doWelding()
    {return 13;}
public int doMechanic()
    {return 10;}
public int doCleaning()
    {return 9;}
public int doDishes()
    {return 12;}
public int doPlumbing()
    {return 14;}
public int doCashier()
    {return 9;}       
}

我正在尝试创建一个 Manager 类,但我完全糊涂了。我什至不知道从哪里开始,特别是因为我需要使用递归。请帮忙!

【问题讨论】:

  • 没有必要为每个员工创建一个类型。什么时候你会有 200 名员工?每次雇用某人时都必须编译会很无聊。
  • 这个问题的递归意味着创建一个函数来返回所有可能的(7!)工人/工作组合,从而通过“蛮力”解决问题。关于课程,我不明白你为什么需要创建一个经理课程,工人和工作课程是engouh

标签: java arrays recursion


【解决方案1】:

好的,一些提示:

您可以在此处大大简化状态表示。这里最容易使用的是一个 7x7 成本矩阵,每行代表一个工人,每列代表要完成的工作,每个单元格代表成本。或者,您可以创建一个类工作者等。但请不要为每个工作者实例创建一个类和 7 个方法。

现在,真正的问题是找到最佳解决方案。选择每个工人要完成的工作的排列。你显然有7个!这里的选项(为第一个工人选择 7 个工作中的 1 个,为第二个工人选择剩下的 6 个工作中的 1 个,等等)。

这就是递归的用武之地。您可以做出第一个选择,然后再次调用您的方法来做出第二个选择,依此类推。当所有 7 个选项都做出后,如果它是迄今为止最好的,则记录成本。让递归倒退一步,做出不同的选择。您还需要一个布尔数组来标记哪些作业已经被选中,以避免重复。

我将把实际代码留给你,因为它是一个练习。

【讨论】:

    【解决方案2】:

    从数学的角度来看,您正在尝试最小化一个由 7 个方程组成的系统

    10c1+10w+12m+12c2+ 8d+ 9p+10c3  //jennifer
     9c1+13w+10m+ 9c2+12d+14p+ 9c3  //linda
    ...
    

    在哪里

    c1 is carpentry
    w is welding
    ...
    

    并且每个变量在整个系统中必须只有一次等于“1”,其他时间都必须等于“0”。

    尝试从这里开始。 此外,你的代表是不够的。不能为每个人开设一门课程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2016-09-03
      • 1970-01-01
      • 2022-01-11
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多