알고리즘
조합론
mintuchel
2023. 4. 3. 13:22
조합도 순열과 같은 느낌으로 풀면 되는데 조합의 특징만 살려주면 된다
조합은 순열과 다르게 순서가 상관이 없다
즉 1 2 3 이랑 2 1 3이랑은 같다.
따라서 오름차순으로 조합들을 출력한다 할때
N을 base로 출력했으면 그 다음부터는 N이 없다고 생각해도 된다.

왜냐하면 N을 base로 생각하고 나온 조합들이 N이 들어간 모든 조합들이기 때문이다.
따라서 순열 DFS코드를 조금만 변형해주면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
#define SIZE 10
using namespace std;
int arr[SIZE];
vector<int> ans;
int N, M;
void print() {
for (int i = 0; i < M; i++) cout << ans[i] << " ";
cout << "\n";
}
void DFS(int start, int cnt) {
if (cnt == M) {
print();
return;
}
for (int i = start; i <= N; i++) {
ans.push_back(arr[i]);
DFS(i + 1, cnt + 1);
ans.pop_back();
}
return;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) arr[i] = i;
DFS(1, 0);
return 0;
}
매개변수로 start를 추가하여 start 앞 원소들은 이미 count한 것들이므로 빼면 된다
참고로 이 start변수가 있으니 visited는 따로 필요가 없다.