正确的组合

时间:2012-10-03 15:50:35

标签: java combinations

我的初学者课程中遇到了问题而且不知道如何继续

问题:

有三种类型的人参加:person1,person2和person3。

每种类型的人都收取不同的金额: 1 - 每个75美元 2 - 每个99美元 3 - 每人40美元

大会上有100人,总收入为7869美元。

WRITE ONE JAVA PROGRAM找到正确的组合,总收入为7869美元。您的程序必须从头到尾解决问题而无需用户输入。

到目前为止:

public class Problem1_kj
{
    public static void main (String[] args) throws IOException
    {
        int Programmers = 75;
        int amountOfProgrammers;
        int Debuggers = 99;
        int amountOfDebuggers;
        int Guests = 40;
        int amountOfGuests;
        int Total;
        int People = 100;

    while (true)
    {
        if (Total == 7869)
        {
            amountOfProgrammers = 1;
            amountOfDebuggers = 1;
            amountOfGuests = 1;
            System.out.println ("Programmers: " + amountOfProgrammers + " Debuggers: " + amountOfDebuggers + " Guests: " + amountOfGuests);
            break;
        }
    }
}

}

我知道你必须继续循环才能找到答案,但我不知道怎么回事?


谢谢!
我找到了100 | 0 | 0方法的解决方案

4 个答案:

答案 0 :(得分:1)

与使用两个嵌套循环尝试每个可能值的简单蛮力方法相比,您可以更智能地执行此操作,例如:

for p1 in 0..100:
    for p2 in 0..100-p1:
        p3 = 100 - p1 - p2
            calculate from p1, p2 and p3, output if matching

这为您提供了加起来为100的p1p2p3的正确组合。p2的限制是优化,因为我们知道 p1 + p2必须小于或等于100。

并且,由于p1 + p2 + p3正好为100,p3根据p1p2的值进行修正,因此不需要循环。

计算只需计算出费用p1 * 75 + p2 * 99 + p3 *40并检查其是否有正确的总费用,如果是您所追求的,则输出p1/2/3值。

例如,这是一个Python程序(因为这是一个很好的教学/伪代码语言),它可以做到这一点:

for p1 in range (0, 101):
    for p2 in range (0, 101-p1):
        p3 = 100 - p1 - p2
        if p1 * 75 + p2 * 99 + p3 * 40 == 7869:
            print p1, p2, p3

输出为33 46 21

答案 1 :(得分:0)

最简单但最慢的暴力方法是从0 | 0 | 0开始,然后迭代到100 | 0 | 0以找到解决方案。

e.g。

for(amountOfProgrammers = 0; amountOfProgrammers < 100; amountOfProgrammers++)
{
    for(amountOfDebuggers = 0; amountOfDebuggers < 100 - amountOfProgrammers; amountOfDebuggers ++)
    {
        for(amountOfGuests = 0; amountOfGuests < 100 - amountOfProgrammers - amountOfDebuggers ; amountOfGuests ++)
        {
            check if valid
        }
    }
}

请注意,我是一个c ++ dev并且代码可能不是100%正确的java,但是你明白了

这可以通过删除内循环来优化

for(amountOfProgrammers = 0; amountOfProgrammers < 100; amountOfProgrammers++)
{
    for(amountOfDebuggers = 0; amountOfDebuggers < 100 - amountOfProgrammers; amountOfDebuggers ++)
    {
        amountOfGuests = 100 - amountOfProgrammers - amountOfDebuggers;
        check if valid;
    }
}

但最终你最好的解决方案是解决这些方程式

x*75 + y*90 + z*40 = 7869
x + y + z = 100

答案 2 :(得分:0)

由于这是家庭作业,我将尝试不提供完整的答案。而只是暗示我将如何解决它:

您的问题分解为以下数学问题:

7869 = 75*x + 99*y + 40*z
100 = x + y + z
solve for x,y,and z

通常使用代数和求解方程组需要为每个需要求解的变量分配一个公式。你有3个变量和2个方程式,所以这就是编程的用武之地。

您需要编写一些循环,为每个x,y和z提供满足上述两个方程式的值。 (其他人已在他们的答案中提供了这些循环的伪代码)

答案 3 :(得分:0)

要解决此问题,您需要查看Person1和Person2的所有可能组合,在这种情况下,这些组合是参加会议的这些类型的人数。 Paxdiablo在他的回答中向您展示了循环的外观以及如何计算Person3的值。

因此,在最里面的循环中,您需要执行以下操作:

ConfComboRev = (p1 * 75) + (p2 * 99) + (p3 * 40);
if (ConfComboRev == 7869)
{
    // Save p1, p2, and p3 in a list for output later.
    ...
}

在最后一个循环结束时,输入代码以打印列表中的值:

// Print out each combination in the list that adds up to 7869.
...

由于可能有多个解决方案,我找到第一个组合后不会停止。相反,请浏览所有可能的组合并将匹配的每个组合保存到通用列表中。最后打印出清单。

另一个注意事项 - 尝试使用更具描述性的名称。例如,使用ProgPaid或ProgCost代替Programmers。此外,定义一个常量(请参阅Java final关键字)或变量而不是硬数字(如7869,75,99和40),以便使代码更易于理解,维护和重用。