ПредишенСледващото

комбинации поколение

В комбинаторна комбинация от п различни елементи на М М е набор от елементи, избрани от множество от N елементи. Тези комплекти се различават само по получаване в тях определени елементи от M, по реда на елементите в този набор не е важно. Комплектите, които се различават само по реда на елементите (но не и персонал) се считат за едни и същи, и тази комбинация се различават от тези разположения.

Комбинации без повторение

Задача. Намери всички възможни комбинации без повторение на множество елементи 2.
Има следните комбинации:

Броят на възможните комбинации, без повторение на N елементи на М може да се определи съгласно формула (N≥M):

че M! пъти по-малко от съответния брой разположения без повторения (без повторение комбинации не зависят от порядъка на елементи последователност).

Разглеждане на проблема за получаване на всички комбинации от числа 1. N М.

Прилагане на C ++

#include
използване на пространството от имена STD;
BOOL NextSet (междинно съединение * с, Int п, Int т)
Int к = m;
за (INT I = к - 1; I> = 0; --i)
ако (а [Ь] ++на [Ь];
за (Int J = + 1; й на [J] = а [й - 1] + 1;
върнете вярно;
>
върнете невярна;
>
нищожен Print (инт * а, вътр н)
статичен Int бр = 1;
cout.width (3);
Cout < за (INT I = 0; и Cout < Cout <>
INT главната ()
Int п, т, * а;
Cout <<"N = " ;
CIN >> н;
Cout <<"M = " ;
CIN >> m;
а = ново междинно съединение [п];
за (INT I = 0; и на [I] = I + 1;
Печат (а, т);
ако (п> = т)
докато (NextSet (а, п, т))
Печат (а, т);
>
cin.get (); cin.get ();
връщане 0;
>

Комбинации с повторение

Комбинации с повторения наречени комплекта M елементи, където всеки елемент на комплект N могат да участват няколко пъти. Където съотношението на стойностите на М и N са без ограничения, и общия брой на комбинации с повторения на

Един пример за този проблем е изборът на M пощенски картички от N по всеки възможен начин.

За генериране комбинации с повторения използват разтвора за генериране на разположения с повторения обсъдени в тази статия.

Прилагане на C ++

#include
използване на пространството от имена STD;
BOOL NextSet (междинно съединение * с, Int п, Int т)
Int J = m - 1;
докато (а [й] == п J> = 0) j--;
ако (к <0) return false;
ако (а [й]> = N)
j--;
на [й] ++;
ако (J == М - 1) връщане вярно;
за (междинно съединение к = к + 1; к на [к] = а [й];
върнете вярно;
>
нищожен Print (инт * а, вътр н)
статичен Int бр = 1;
cout.width (3);
Cout < за (INT I = 0; и Cout < Cout <>
INT главната ()
Int п, т, * а;
Cout <<"N = " ;
CIN >> н;
Cout <<"M = " ;
CIN >> m;
Int з = п> т. п. m; // размер на масива е избран като макс (п, т)
а = ново междинно съединение [Н];
за (INT I = 0; и на [I] = 1;
Печат (а, т);
докато (NextSet (а, п, т))
Печат (а, т);
cin.get (); cin.get ();
връщане 0;
>

В резултат на по-горе алгоритъм:

комбинации поколение

комбинации поколение

Свързани статии

Подкрепете проекта - споделете линка, благодаря!