В комбинаторна комбинация от п различни елементи на М М е набор от елементи, избрани от множество от 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; й
върнете вярно;
>
върнете невярна;
>
нищожен Print (инт * а, вътр н)
статичен Int бр = 1;
cout.width (3);
Cout <
INT главната ()
Int п, т, * а;
Cout <<"N = " ;
CIN >> н;
Cout <<"M = " ;
CIN >> m;
а = ново междинно съединение [п];
за (INT I = 0; и
Печат (а, т);
ако (п> = т)
докато (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 главната ()
Int п, т, * а;
Cout <<"N = " ;
CIN >> н;
Cout <<"M = " ;
CIN >> m;
Int з = п> т. п. m; // размер на масива е избран като макс (п, т)
а = ново междинно съединение [Н];
за (INT I = 0; и
Печат (а, т);
докато (NextSet (а, п, т))
Печат (а, т);
cin.get (); cin.get ();
връщане 0;
>
В резултат на по-горе алгоритъм:
Свързани статии