백트래킹 클래스 4 마지막 문제.
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
-N개의 자연수 중에서 M개를 고른 수열같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
우선은 0, 0(0번째 배열, level 0) 부터 시작하여 값을 하나씩 찾아나간다. cnt 변수를 이용하여 M개의 숫자를 모두 구하면 그것을 출력하고 다음으로 넘어가도록 한다. 다른 자리의 같은 수를 중복으로 처리하는 것을 방지하기 위해 입력 배열에서 같은 값에 대해서는 중복 연산을 무시한다.
#include<bits/stdc++.h>
using namespace std;
int N, M;
int arr[11];
int ans[11];
void DFS(int U, int cnt){
if(cnt==M){
for(int i=0; i<M; i++){
cout<<ans[i]<<" ";
} cout<<"\n"; return;
}int last=0;
for(int i=U; i<N; i++){
int nx=arr[i];
if(last==nx)
continue;
last=arr[i];
ans[cnt]=arr[i];
DFS(i, cnt+1);
}
}
int main(){
cin>>N>>M;
for(int i=0; i<N; i++){
cin>>arr[i];
} sort(arr, arr+N);
DFS(0, 0);
}'알고리즘' 카테고리의 다른 글
| Boj 9465 c++ 스티커 (0) | 2025.07.16 |
|---|---|
| Boj 1932 c++ 정수 삼각형 (0) | 2025.07.15 |
| Boj 11660 c++ 구간 합 구하기 5 (0) | 2025.07.14 |
| Boj 12865 c++ 평범한 배낭 (1) | 2025.07.14 |
| Boj 11053 c++ 가장 긴 증가하는 부분수열 (2) | 2025.07.14 |