Как рассчитать количество перестановок в базовой комбинаторике 3? - PullRequest
1 голос
/ 15 января 2009

Я никогда не любил математику, и я надеюсь, что кто-то может помочь мне со следующим.

У меня есть 5 коробок:

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

Ящики могут быть белыми, серыми или черными (или думать об этом как 0, 1, 2)

В скольких возможных состояниях может находиться бокс-сет?

Что такое псевдокод (или на любом языке) для генерации всех возможных результатов ??

есть ...

00000
00001
00011
00111

и т. Д. И т. Д. *

Я действительно ценю любую помощь, которую кто-нибудь может мне дать.

Ответы [ 15 ]

7 голосов
/ 15 января 2009

ответ на количество комбинаций: 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
6 голосов
/ 15 января 2009

Это классическая проблема генерации перестановок. У вас есть 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);
    }
}
5 голосов
/ 15 января 2009

Чтобы ответить на ваш первый вопрос, каким был бы ответ, если бы поля могли содержать только одно из двух значений? Итак, каков ответ, если поля содержат одно из трех значений?

Чтобы ответить на ваш второй вопрос, какой псевдокод генерирует все возможные результаты одного блока? Теперь псевдокод генерирует все возможные результаты двух блоков?

3 голосов
/ 15 января 2009

Я бы рекомендовал сначала решить проблему на бумаге. Попробуйте решить это с меньшим количеством блоков (может быть, три), и перечислите все возможности. Затем подумайте, как прошли ваши рассуждения или как вы объяснили, что вы сделали с маленьким ребенком.

1 голос
/ 16 января 2009

Спасибо всем за ваши ответы, по крайней мере, тем из вас, кто на самом деле дал мне один.

Хотя я могу оценить, что вопрос звучал так, как будто его вытащили из Computer Science 101, но это не так. Ирония в том, что это было для реальной жизни в настоящий крайний срок, и у меня не было времени вернуться к тому, когда меня учили этому материалу и говорил себе: «когда мне когда-нибудь понадобится эта чушь»

Если бы я хотел, чтобы меня покровительствовали и обращались как со школьником, я бы вернулся в начальную школу и спросил моего учителя 5-го класса, могу ли я пойти в ванную

Еще раз спасибо

0 голосов
/ 06 января 2017
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);
    }
}
0 голосов
/ 16 января 2009

Вашей проблеме не нужно ничего, кроме правила продукта в комбинаторике.

Вы можете выбрать состояние первого блока 3-мя способами и состояние второго блока 3-мя способами, и ... и состояние 5-го блока 3 способами. Количество способов, с помощью которых вы можете установить состояние всех блоков, является произведением всех пяти (равных) чисел способов, то есть 3x3x3x3x3 = 3 5 .

Аналогичный вопрос: сколько чисел вы можете сформировать с 5 цифрами в десятичной системе, считая ведущие нули? То есть сколько там цифр от 00000 до 99999? Вы можете выбрать первую цифру 10 способами (0 ... 9) и т. Д. И т. Д., И ответ, как вы уже знаете, 10х10х10х10х10 = 100000.

0 голосов
/ 15 января 2009

Даже не пытайтесь писать код, чтобы ответить на это! Причина в том, что вам нужны очень большие числа (факториалы) для его вычисления. Они создают числа намного больше, чем любой базовый тип в CLR. Вы можете использовать эту библиотеку с открытым исходным кодом для выполнения расчетов.

0 голосов
/ 15 января 2009

Могу я спросить, что по этому поводу вы не понимаете или что вас сбивает с толку? Я вижу, что все здесь просто ответили на вопрос, но если вы скопировали их ответы, вы ничему не научились и, таким образом, полностью упустили смысл домашней работы. Предполагая, что ваш следующий урок будет основан на этом, вы просто отстанете.

Если бы вы или работали на меня, или были в моем классе, я бы просто спросил следующее ...

"Как вы думаете, проблема должна быть решена?" Ответ на который может показать, где вы зависаете. Один мой мудрый профессор в КМУ однажды сказал: «Я не могу помочь тебе понять это, пока ты не узнаешь, чего ты не понимаешь». я.

Я знаю, что, вероятно, слишком поздно, но для этих домашних заданий я действительно думаю, что мы должны помогать человеку учиться, а не просто давать ответ и делать за них домашнюю работу.

0 голосов
/ 15 января 2009

Вот как я впервые научился это делать: сначала подумайте, сколько вариантов вы делаете. Вы делаете пять вариантов, по одному на каждую коробку. Поэтому запишите пять пустых строк со знаками умножения:

__ x __ x __ x __ x __ = ?

В каждом пустом поле укажите количество объектов, которые вы должны выбрать для этого поля. Поскольку у вас есть 3 номера на выбор для каждого поля, вы пишете 3 в каждые пробел:

3 x 3 x 3 x 3 x 3 = 243

Это дает вам общее количество перестановок для этих выборов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...