1

我从来没有太多的数学,我希望有人可以帮助我解决以下问题。

我有5个盒子:

 1   2   3   4   5
[ ] [ ] [ ] [ ] [ ]

这些框可以是白色、灰色或黑色(或将其视为 0、1、2)

盒子集合可以有多少种可能的状态?

生成所有可能结果的伪代码(或任何语言)是什么?

IE...

00000
00001
00011
00111

等等等等……

我真的很感谢任何人可以为此提供的任何帮助。

4

15 回答 15

8

组合数量的答案是:3x3x3x3x3 (3^5),因为每个盒子可以有 3 种可能的颜色。

至于生成结果,看看你能不能用这个矩阵用 0、1 或 2 来表示盒子的颜色。在较小的规模上(假设 3 个盒子),它看起来像这样:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2
于 2009-01-15T18:02:26.373 回答
6

这是一个经典的置换生成问题。每个职位有 3 种可能性,以及 5 个职位。生成的字符串总数为 3^5 = 243。如果需要通用解决方案,则需要递归(简单的迭代循环仅适用于问题的单个实例)。

这是一个简单的例子:

public static void Main(string[] args){

    Generate("", 5);
}

private void Generate(string s, int limit)
{
    if (s.Length == limit)
        Console.WriteLine(s);
    else
    {
        Generate(s+"0", limit);
        Generate(s+"1", limit);
        Generate(s+"2", limit);
    }
}
于 2009-01-15T18:04:29.380 回答
5

要回答您的第一个问题,如果这些框只能包含两个值中的一个,答案会是什么?那么,如果这些框包含三个值之一,答案是什么?

要回答您的第二个问题,什么伪代码会生成一个盒子的所有可能结果?现在,伪代码生成两个框的所有可能结果?

于 2009-01-15T17:59:43.400 回答
3

我建议先在纸上解决问题。尝试用较少数量的盒子(也许三个)来解决它,并列出所有可能性。然后,想想你的推理是如何进行的,或者你会如何向一个小孩解释你做了什么。

于 2009-01-15T18:00:00.780 回答
1

这似乎是一个家庭作业问题。那我就给你一些关于解决方案的帮助。

你说的是每个盒子都有三个状态,它们都是独立的。一个盒子有 3 个解决方案,两个盒子有 3 * 3 个解决方案 - 对于第一个盒子的每个状态,第二个盒子也有三个状态。将其扩展到 5 个盒子。

要生成每个解决方案,您可以循环浏览它。很容易为每个盒子制作嵌套的 for 循环,乘以 10 的幂可以让你一次显示数字。

您可以以类似的方式概括多个框的代码。

于 2009-01-15T17:59:14.477 回答
1

谢谢大家的回答,至少是那些真正给我答案的人。

虽然我可以理解这个问题听起来像是直接从计算机科学 101 中提取出来的,但事实并非如此。具有讽刺意味的是,这是在真正的截止日期前的现实生活,我没有时间回想当我被教这些东西并对自己说:“我什么时候需要这个废话”

如果我想像小学生一样受到光顾和对待,我会回到我的小学,问我五年级的老师我是否可以去洗手间

再次感谢

于 2009-01-16T16:31:16.193 回答
0

可能性的数量是 3 的 5 次方

如果您从 0 循环到该数字 - 1 并以基数 3 表示它,您将拥有所有可能性(请记住在必要时添加 0)

在红宝石中:

number_of_possibilities = 3**5-1

for i in (0..number_of_possibilities)
  base_3_number = i.to_s(3)
  puts "%05d" % base_3_number # number formatting used to prepend 0s where necessary
end
于 2009-01-15T17:58:53.510 回答
0

状态数为 3^5。

伪代码是

for value from 0 to 3^5-1
    print base3(value)

其中 base3 是一个函数,它反复取模 3 来获得一个数字,然后删除该数字(除以 3)

于 2009-01-15T17:59:26.223 回答
0

提示:想象每个方框是一个数字中的一个位置,每种颜色是一个不同的数字。在现实世界中,2 个位置和 10 个可能的数字有多少种组合(包括零)?3个职位呢?给定您可用的位数,添加额外位置和组合数量之间有什么关系?

于 2009-01-15T18:01:09.543 回答
0

唯一组合数:3^5=243

代码:

n = 0
for i = 0 to 3^5-1
{
    s = ""
    for j = 1 to 5
    {
        d = n mod 3
        s = toascii(d) . s
        n = n / 3
    }
    println s
    i = i + 1
}
于 2009-01-15T18:03:19.587 回答
0

这是我第一次学会这样做的方法:首先考虑一下您正在做出多少选择。您正在做出五个选择,每个框一个。所以写下五个带乘号的空行:

__ x __ x __ x __ x __ = ?

在每个空白处,写下您必须为该框选择的对象数量。因为每个方框有 3 个数字可供选择,所以在每个空白处写一个 3:

3 x 3 x 3 x 3 x 3 = 243

这为您提供了这些选择的排列总数。

于 2009-01-15T18:16:15.660 回答
0

我能问一下您对此有什么不理解或绊倒您的原因吗?我看到这里的每个人都只是简单地回答了这个问题,但是如果你复制他们的答案,你什么也没学到,因此完全错过了作业的重点。假设你的下一课建立在这一课的基础上,你只会落后得更远。

如果您为我工作或在我的班上,我只会问以下问题...

“你觉得这个问题应该怎么解决?” 答案可能会揭示你挂断电话的地方。我在 CMU 的一位睿智教授曾经说过“我无法帮助你理解这一点,除非你知道你不明白什么”我。

我知道可能为时已晚,但对于这些家庭作业问题,我真的认为我们应该帮助人们学习,而不是简单地提供答案并为他们做作业。

于 2009-01-15T18:18:34.017 回答
0

甚至不要尝试编写代码来回答这个问题!原因是您需要一些非常大的数字(阶乘)来计算它。这些创建的数字比 CLR 中的任何基本类型都大得多。您可以使用这个开源库来进行计算。

于 2009-01-15T18:56:05.283 回答
0

您的问题只需要组合数学中的乘积规则即可。

您可以通过 3 种方式选择第一个框的状态,并以 3 种方式选择第二个框的状态,以及...以及 3 种方式选择第 5 个框的状态。您可以设置所有框的状态的方式数是所有五个(相等)方式数的乘积,即 3x3x3x3x3 = 3 5

类似的问题:在十进制系统中,您可以用 5 位数字组成多少个数字,计算前导零?也就是说,从 00000 到 99999 有多少个数字?您可以通过 10 种方式(0...9)选择第一个数字,依此类推,答案是 10x10x10x10x10 = 100000,正如您已经知道的那样。

于 2009-01-15T23:32:42.463 回答
0
void solve(int p=0,int n=5,int d=0)
{
    if (n==p)
    {
        int rev=d;
        int i=0;
        while (i<5) {
            cout << rev%10;
            rev /= 10;
            i++;## Heading ##
        }
        cout << endl;
        return;
    }
    for(int i=0; i<3 ; i++)
    {
        solve(p+1,n, d*10 + i);
    }
}
于 2017-01-06T11:25:06.910 回答