Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

и задачки для интервью.
Kom6iHatop

Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by Kom6iHatop »

Комбинаторика. Сколько всего возможных комбинаций из пяти чисел 12345, да 120, надо лишь эти числа между собой перемножить 1*2*3*4*5=120, но есть одно "но" нужно подсчитать еще и такие варианты как например 11234, 11123, 11112, 12234, 12333, 12222, 12344 и т.д., и как их всех вывести в экселе? :crazy:
User avatar
Komissar
Уже с Приветом
Posts: 65200
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by Komissar »

Kom6iHatop wrote: 01 Sep 2019 01:47 Комбинаторика. Сколько всего возможных комбинаций из пяти чисел 12345, да 120, надо лишь эти числа между собой перемножить 1*2*3*4*5=120, но есть одно "но" нужно подсчитать еще и такие варианты как например 11234, 11123, 11112, 12234, 12333, 12222, 12344 и т.д., и как их всех вывести в экселе? :crazy:
120 это перестановки без повтора. А если разрешить номерам повторяться, то еще проще: 5*5*5*5*5, т.е. 3125 вариантов.
Kom6iHatop

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by Kom6iHatop »

забыл добавить что такого варианта как 11225 и 55555 в моих ситуациях быть не может, только 11223 и 11111 и еще в моей задачи такого варианта как 54123 или 12453 быть не может, только по возрастанию например 11123, 12223, 12344...
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by M. Ridcully »

Вы как-то путанно объясняете, что именно вам нужно подсчитать. Попробую угадать. Если вы хотите подсчитать количество разных возрастающих последовательностей длины N, начинающихся с 1, и возрастать позволяется только на единичку, то ответ будет 2 ^ (N - 1). То есть в вашем случае 2 ^ 4 = 16.
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by M. Ridcully »

Kom6iHatop wrote: 01 Sep 2019 01:47 и как их всех вывести в экселе? :crazy:
Как их вывести в Экселе я не знаю, но на Питоне можно напечатать вот так, например:

Code: Select all

def next_seq(l, n):                                                             
    for i in range(len(l) - 1, 0, -1):                                          
        if l[i] == l[i - 1]:                                                    
            l[i:] = [l[i] + 1] * (len(l) - i)                                   
            return True                                                         
    return False                                                                
                                                                                
def print_all(n):                                                               
    l = [1] * n                                                                 
    print(l)                                                                    
    while next_seq(l, n):                                                       
        print(l)                                                                
                                                                                
print_all(5)                                                                    
Это если нужно генерить все такие последовательности.
Если нужно сгенеить только конкретную какую-то i-тую последовательность, то можно это сделать, например, представив i в бинарном виде, где 1 означает увеличить следующе число, а 0 - оставить прежним.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10520
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by IvanGrozniy »

M. Ridcully wrote: 01 Sep 2019 18:42
Kom6iHatop wrote: 01 Sep 2019 01:47 и как их всех вывести в экселе? :crazy:
Как их вывести в Экселе я не знаю, но на Питоне можно напечатать вот так, например:

Code: Select all

def next_seq(l, n):                                                             
    for i in range(len(l) - 1, 0, -1):                                          
        if l[i] == l[i - 1]:                                                    
            l[i:] = [l[i] + 1] * (len(l) - i)                                   
            return True                                                         
    return False                                                                
                                                                                
def print_all(n):                                                               
    l = [1] * n                                                                 
    print(l)                                                                    
    while next_seq(l, n):                                                       
        print(l)                                                                
                                                                                
print_all(5)                                                                    
Это если нужно генерить все такие последовательности.
Если нужно сгенеить только конкретную какую-то i-тую последовательность, то можно это сделать, например, представив i в бинарном виде, где 1 означает увеличить следующе число, а 0 - оставить прежним.
Посмотрел ваше решение и запустил. Решено с ошибками. Все числа начинатся с единицы. Во-вторых, выведенных вариантов гораздо меньше 120. Вот ваш вывод:
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 2]
[1, 1, 1, 2, 2]
[1, 1, 1, 2, 3]
[1, 1, 2, 2, 2]
[1, 1, 2, 2, 3]
[1, 1, 2, 3, 3]
[1, 1, 2, 3, 4]
[1, 2, 2, 2, 2]
[1, 2, 2, 2, 3]
[1, 2, 2, 3, 3]
[1, 2, 2, 3, 4]
[1, 2, 3, 3, 3]
[1, 2, 3, 3, 4]
[1, 2, 3, 4, 4]
[1, 2, 3, 4, 5]
Нужно решать с рекурсией (либо итеративно со стеком). Вот мое решение на Питоне, которое возращает нужную кучу комбинаций:

Code: Select all

class Solution:
    def __generateDigits(self, strResult, answer):
        if len(strResult) == self.n:
            answer.append(strResult)
            return
        for i in range(len(self.possibleDigits)):
            self.__generateDigits(strResult + self.possibleDigits[i], answer)
        
    def getPossibleNumberSequences(self, n):
        self.n = n
        self.possibleDigits = [str(x) for x in range(1, n + 1)]
        answer = []
        self.__generateDigits("", answer)
        return answer

print(Solution().getPossibleNumberSequences(5))
    
User avatar
M. Ridcully
Уже с Приветом
Posts: 12003
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by M. Ridcully »

IvanGrozniy wrote: 06 Feb 2020 19:59
M. Ridcully wrote: 01 Sep 2019 18:42
Kom6iHatop wrote: 01 Sep 2019 01:47 и как их всех вывести в экселе? :crazy:
Как их вывести в Экселе я не знаю, но на Питоне можно напечатать вот так, например:

Code: Select all

def next_seq(l, n):                                                             
    for i in range(len(l) - 1, 0, -1):                                          
        if l[i] == l[i - 1]:                                                    
            l[i:] = [l[i] + 1] * (len(l) - i)                                   
            return True                                                         
    return False                                                                
                                                                                
def print_all(n):                                                               
    l = [1] * n                                                                 
    print(l)                                                                    
    while next_seq(l, n):                                                       
        print(l)                                                                
                                                                                
print_all(5)                                                                    
Это если нужно генерить все такие последовательности.
Если нужно сгенеить только конкретную какую-то i-тую последовательность, то можно это сделать, например, представив i в бинарном виде, где 1 означает увеличить следующе число, а 0 - оставить прежним.
Посмотрел ваше решение и запустил. Решено с ошибками. Все числа начинатся с единицы. Во-вторых, выведенных вариантов гораздо меньше 120. Вот ваш вывод:
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 2]
[1, 1, 1, 2, 2]
[1, 1, 1, 2, 3]
[1, 1, 2, 2, 2]
[1, 1, 2, 2, 3]
[1, 1, 2, 3, 3]
[1, 1, 2, 3, 4]
[1, 2, 2, 2, 2]
[1, 2, 2, 2, 3]
[1, 2, 2, 3, 3]
[1, 2, 2, 3, 4]
[1, 2, 3, 3, 3]
[1, 2, 3, 3, 4]
[1, 2, 3, 4, 4]
[1, 2, 3, 4, 5]
Дык, вы почитайте повнимательнее, что я выше написал - я пытался понять, какую именно воследлательность требуется вывести.
Если все возможные перестановки, то и мучаться не надо:

Code: Select all

from itertools import permutations
print(list(permutations(range(1, 6))))
User avatar
Uzito
Уже с Приветом
Posts: 8230
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Комбинаторика. Сколько всего возможных комбинаций из пяти чисел

Post by Uzito »

Вы хотите вот это?

Code: Select all

for a in range(1,6):
	for b in range(a,6):
		for c in range(b,6):
			for d in range(c, 6):
				for e in range (d, 6):
					print(a,b,c,d,e)

Return to “Головоломки”