Java 递归寻找最便宜的解决方案

Java 递归寻找最便宜的解决方案,java,arrays,recursion,Java,Arrays,Recursion,我有这个问题要做: 使用递归编写函数以执行以下操作:您是一个小工厂的经理。你有7名工人和7项工作要做。每个工人分配一份且仅分配一份工作。每个工人要求每项工作有不同的报酬。(例如:工人阿尔奇要求10美元用于焊接,15美元用于木工等。工人贾赫德要求12美元用于焊接,5美元用于木工等)找到对你来说最便宜的工作分配 我创建了这八个类,关于每个工人需要多少: 一个可能不必要的超类 public class Workers { public int doCarpentry() {return 0;}

我有这个问题要做:

使用递归编写函数以执行以下操作:您是一个小工厂的经理。你有7名工人和7项工作要做。每个工人分配一份且仅分配一份工作。每个工人要求每项工作有不同的报酬。(例如:工人阿尔奇要求10美元用于焊接,15美元用于木工等。工人贾赫德要求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类,但我完全搞不清楚。我甚至不知道从哪里开始,特别是因为我需要使用递归。请帮忙

从数学的角度来看,你试图最小化一个由7个方程组成的系统

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

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

试着从这个开始。 此外,你的陈述还不够充分。你不能为每个人都上一节课。

好的,有几点提示:

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

现在,真正的问题是找到一个最优的解决方案。选择每个工人要完成的工作的排列。你显然有7个!此处的选项(第一个工人从7份工作中选择1份,第二个工人从剩余的6份工作中选择1份,以此类推)

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


我将把实际代码留给您,因为这是一个练习

不必要的是为每个员工创建一个类型。你什么时候会有200名员工?每次雇佣员工时都要进行编译,这会变得很无聊。这个问题的递归意味着创建一个函数来返回所有可能(7!)的工人/工作组合,从而通过“暴力”解决问题。关于类,我不明白为什么需要创建一个manager类,worker类和job类都是英语
c1 is carpentry
w is welding
...