순열, 중복순열, 조합, 중복조합
순열
서로 다른 n개의 원소 중에서 중복 없이 r개를 골라 순서대로 나열하는 것
nPr = n! / (n - r)!
// 순열
boolean[] isSelected = new boolean[N + 1];
int[] numbers = new numbers[N + 1];
public void perm(int cnt) {
if (cnt == R) {
System.out.println(Arrays.toString(numbers));
return;
}
for (int i = 1; i <= N; i++) {
if (isSelected[i]) continue;
numbers[cnt] = i;
isSelected[i] = true;
perm(cnt + 1);
isSelected[i] = false;
}
}
중복 순열
서로 다른 n개의 원소 중에서 중복을 허용하여 r개를 골라 순서대로 나열하는 것
nΠr = n^r
// 중복 순열
int[] numbers = new int[N + 1];
public void perm2(int cnt) {
if (cnt == R) {
System.out.println(Arrays.toString(numbers));
return;
}
for (int i = 1; i <= N; i++) {
numbers[cnt] = i;
perm2(cnt + 1);
}
}
조합
서로 다른 n개의 원소 중에서 중복없이 r개를 선택하는 것
순서는 고려하지 않는다.
nCr = n! / ((n - r)! * r!)
// 조합
int[] numbers = new int[N + 1];
public void comb(int cnt, int start) {
if (cnt == R) {
System.out.println(Arrays.toString(numbers));
return;
}
for (int i = start; i <= N; i++) {
numbers[i] = i;
comb(cnt + 1, i + 1);
}
}
중복 조합
서로 다른 n개의 원소 중에서 중복을 허락하여 r개를 선택하는 것
순서는 고려하지 않는다.
nHr = (n+r-1)Cr
int[] numbers = new int[N + 1];
public void comb(int cnt, int start) {
if (cnt == R) {
System.out.println(Arrays.toString(numbers));
return;
}
for (int i = start; i <= N; i++) {
numbers[i] = i;
comb(cnt + 1, i);
}
}