Задачка из комбинаторики

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Задачка из комбинаторики

Сообщение Георгий2 » 14.01.2009 (Ср) 17:57

Помогите пожалуйста реализовать такое:
Имеется N ячеек и M фишек (N>M), в ячейке может находится не более K фишек, требуется сгенерировать все возможные варианты распределения фишек по этим ячейкам, причём ячейки могут быть и пустыми тоже. То есть может быть и вариант когда все фишки лежат в одной ячейке, а остальные пустые (конечно, если это не противоречит условию по K)

Пытался читать книжки по комбинаторике, но склад ума совершенно нематематический - не смог даже понять, к какому типу отнести мою задачку - перестановки ли, сочетания ли?
Готовые алгоритмы на VB не смог найти.

Спасибо всем откликнувшимся

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Задачка из комбинаторики

Сообщение tyomitch » 14.01.2009 (Ср) 18:31

Тести.
Код: Выделить всё
Option Explicit
DefInt A-Z

Sub Main()
Const N = 4, M = 3, K = 2
Generate "", N, M, K
End Sub

Sub Generate(ByVal Prefix$, ByVal N, ByVal M, ByVal K)
    If N = 1 Then
        If M <= K Then
            Debug.Print Prefix & M
        End If
    Else
        Dim i
        For i = 0 To K
            If i <= M Then
                Generate Prefix & i & ",", N - 1, M - i, K
            End If
        Next
    End If
End Sub
Изображение

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Задачка из комбинаторики

Сообщение Георгий2 » 14.01.2009 (Ср) 20:41

tyomitch !
Огромное спасибо! Вроде всё работает как надо!

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Задачка из комбинаторики

Сообщение Георгий2 » 15.01.2009 (Чт) 18:08

tyomitch, здравствуйте !

всё же что-то не так, я проверил при N = 4, M = 3, K = 3, прога выдаёт такую последовательность:
0,0,2,1
0,0,3,0
0,1,0,2
0,1,1,1
0,1,2,0
0,2,0,1
0,2,1,0
0,3,0,0
1,0,0,2
1,0,1,1
1,0,2,0
1,1,0,1
1,1,1,0
1,2,0,0
2,0,0,1
2,0,1,0
2,1,0,0
3,0,0,0

при "мозго-ручном" методе получаются ещё 2 комбинации:
0,0,1,2
0,0,0,3

PS
Несмотря на лаконичность кода, не смог понять куда вставить счётчик, чтоб получать общее количество комбинаций, куда не попытался вставить - не получается 20 комбинаций

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Задачка из комбинаторики

Сообщение tyomitch » 15.01.2009 (Чт) 18:21

Эти две комбинации печатаются самые первые, и при последующем заполнении окна вывода затираются.
Пройди пошагово и убедись.
Изображение

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Задачка из комбинаторики

Сообщение Георгий2 » 15.01.2009 (Чт) 19:52

Господи, как я лажанулся! ИЗВИНИТЕ! :oops: :oops: :oops:

А счётчик куда правильней вклинить? Не подскажете? Если сделаю по-вашему, то гарантировано без ошибки будет, а сам могу и ошибиться, а ошибка вскроется бог знает на каком этапе работы.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Задачка из комбинаторики

Сообщение tyomitch » 15.01.2009 (Чт) 20:07

Там, где Debug.Print, допиши c=c+1. Объяви c на уровне модуля.
Изображение

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Задачка из комбинаторики

Сообщение Георгий2 » 15.01.2009 (Чт) 20:15

Клянусь, это было первое что я сделал, но при этом изменил и К , но по рассеяности сравнил с посчитанным при предыдущем К, естественно не совпало, а я сделал "выводы", дубина!

tyomitch, Просто ОГРОМНОЕ вам спасибо!!! особливо за ваше всегдашнее терпение к моим глупым вопросам!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34

    TopList  
cron