-
[백준 2798] 블랙잭백준/DFS and 백트래킹 2025. 2. 4. 16:59
전형적인 DFS 사용한 조합론 문제이다.
DFS 돌때 자신의 뒤 idx부터 호출하게 하고
총 3개이면 조건판단해서 종료되게 하였다.
시간초과를 방지하기 위해
3개를 조합하는 과정에서 M을 이미 넘어가게 되면 스킵하게 하였다
#include <iostream> #include <vector> #include <algorithm> #define SIZE 101 using namespace std; int N, M; vector<int> arr; int ans = 0; void solve(int idx, int sum, int cnt){ // 종료조건이면 확인하고 return if(cnt == 3){ // 최신화가 안되어있었거나 지금꺼가 M에 더 가까우면 최신화 if (M - ans > M - sum) { ans = sum; } return; } for (int i = idx + 1; i < N; i++){ // M 보다 커지면 skip if(sum + arr[i] > M) continue; solve(i, sum + arr[i], cnt + 1); if(ans == M) return; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M; int x; for (int i = 0; i < N; i++) { cin >> x; arr.push_back(x); } sort(arr.begin(), arr.end()); solve(-1, 0, 0); cout << ans; return 0; }
'백준 > DFS and 백트래킹' 카테고리의 다른 글
[백준 3109] 빵집 (0) 2025.02.04 [백준 1520] 내리막길 (3) 2025.01.09 [백준 9663] N-Queen (1) 2024.01.21 [백준 6603] 로또 (1) 2024.01.13 [백준 2468] 안전영역 (1) 2023.09.16