Аватар для mr_free
73 / 7 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1

Комбинаторика! Число сочитаний

08.08.2012, 19:55. Показов 6055. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Так как я глубоко начинающий программист, столкнулся с проблемой решения задач по комбинаторике (на данный момент формула числа сочитаний). Каким образом можно записать эту формулу на С++, знаю имееться много способов (через рекурсию и т.д.)? Можете, пожалуйста, написать реализацию и объяснить? Вот пример через рекурсию, но никак не пойму принцип работы, объясните? Сама задача вот, на тестах неверный ответ, а на других лимит времени исчерпан, проверил не правильный ответ на нечетных числах и на числе 2, объясните, пожалуйста, принцип рекурсии здесь, а не просто решите задачу! Пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include <stdio.h>
int rec(int n, int k)
{
    if(n==k)
        return 1;
    if(k==1)
        return n;
    return rec(n-1, k-1)+rec(n-1, k);
}
 
int main()
{
    int n, k;
    cin>>n>>k;
    k=n/2;
    cout<<rec(n,k);
 
 
return 0;
}
П.с. Простите что задаю столь глупый вопрос, но увы никто не может мне объснить (поскольку таких просто нет, мой учитель в лицее не имеет желания работать, все приходиться розпрашивать, но почти всегда ответ один: "Ты этого не знаешь иди почитай эту книгу!", я уже прочитал за эти 2 года огромное количество книг, начиная от основ программирования и заканчивая дискретной математикой. А два других учителя, пока никак со мной не связаны из вузов. Вот и не знаю как же мне программистом стать, если никто не может объяснить!), поэтому буду часто спрашивать. Обидно ведь, когда посылают на олимпиаду, а там все задачи на листочке решил (математически), а как написать программу не знаешь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2012, 19:55
Ответы с готовыми решениями:

Комбинаторика, вычислить число сочетаний C(N, K)
When I was in army, sometimes (about once a week) our unit was faced a charming alternative: most of the hands are to be sent to...

Комбинаторика.Подсчитать число размещений с повторениями
#pragma hdstop #pragma argsused #include &lt;math.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; Long double fact...

Нажатие сочитаний клавиш
Сделал контроллер для управления персонажем и заметил, что не работает сочетание клавиш LEFT-UP-SPACE. Такая же комбинация только вправо -...

40
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.08.2012, 04:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
mr_free, лови, сам решал когда-то
Эти способы считают правильно, но не пройдут по времени. Опишу здесь один способ, который подходит для этой задачи (метод динамического программирования). Я приведу пример вычислений в пределах 1..10 конфет, 1..10 ящиков.
Создаем массив a[10][10]. Для удобства индексацию массива буду называть так: нулевой индекс (номер) строки (столбца) буду называть первым индексом (номером), соответственно первый индекс (номер) массива буду называть вторым...
Пусть номер строки будет обозначать количество конфет, а номер столбца будет обозначать количество ящиков. Тогда изначально массив a[][] заполняем так:
Первый столбец заполняем 1. Первую строку заполняем так: 1 2 3 4 .... (значение элемента первой строки равно номеру столбца).
Затем основное заполнение массива:
C++
1
2
3
for(i=2; i<11; i++)// здесь индексация начинается со значения 2 и заканчивается значением 10 (по мною оговоренному условию - что нумерация (индексация) строк и столбцов начинается с 1, а не с 0). Будьте внимательны при реализации кода!!!
    for(j=2; j<11; j++)
        a[i][j]=a[i-1][j]+a[i][j-1];
В итоге получим массив с помощью которого очень быстро можно узнать сколько вариантов размещения X конфет в Y ящиках. Ответом будет являться значение a[X][Y].
Теперь как считать ответ для этой задачи. Рассмотрим (и разберемся) на примере N=6, S=5.
Всего вариантов размещения 6 конфет в 5 ящиках 210 (это значение берем из массива a[][]).
Теперь вычислим сколько из этих вариантов "плохие" (когда в каком-либо ящике больше 3 конфет). Рассмотрим варианты для 1-го ящика:
- В первом ящике все 6 конфет. В остальных 4-х ящиках 0 конфет. Это 1 "плохой" вариант.
- В первом ящике 5 конфет. В остальных 4-х ящиках 1 конфета. Это 4 "плохих" варианта (значение находим в массиве a[1][4]).
- В первом ящике 4 конфеты. В остальных 4-х ящиках 2 конфеты. Это 10 "плохих" варианта (значение находим в массиве a[2][4]).
Итого для первого ящика имеем 15 плохих варианта. Всего ящиков у нас 5. Значит плохих вариантов всего будет 15*5=75.
Ответ на вопрос: сколько вариантов размещения 6 конфет в 5 ящиках: 210-75=135.
Можно подвести итог: для того чтобы посчитать сколько вариантов размещения X конфет в Y ящиках. нужно вычислить:
a[X][Y] - (a[N/2-1][Y-1] + a[N/2-2][Y-1] + ..... + a[1][Y-1] + 1) * S
При реализации такого варианта с помощью массива размером 1000*1000 окажется что памяти не хватает. Но не обязательно заводить этот массив полностью. Я реализовывал решение с помощью массива a[2][1000], т.е. всего две строки (одна для хранения значений предыдущей строки, во второй расчитывал значение очередной строки).
Ну и не забудьте про длинную арифметику.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2012, 04:27
Помогаю со студенческими работами здесь

Комбинаторика. Найти число целых положительных чисел.
Найти число целых положительных чисел, не превосходящих 1000 и не делящихся ни на одно из чисел: 7, 9, 17

Программа для вычисления числа сочитаний из N по M
незнаю как сделать

Комбинаторика.
Помогите пожалуйста решить задачи, на этом предмете не был ни разу по болезни, препод сказал сделать и сдать( 1. Сколько шестибуквенных...

Комбинаторика
Доброго всем времени суток!Помогите пожалуйста с решением такой задачи.Дана последовательность вещественных чисел.Пользователь вводит...

Комбинаторика
Мама испекла Серёже на день рождения большой и вкусный круглый торт и поручила ему самому его разрезать. У него в распоряжении есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru