반응형
#INFO
난이도 : SILVER2
문제유형 : 백트래킹
출처 : https://www.acmicpc.net/problem/1182
#SOLVE
i번째 수를 더할지 말지 정한 뒤 i+1번째 수를 정하러 들어가는 방식으로 풀이했다.
{-3, -2, 5} 수열을 예시로 들어보도록 하자. 왼쪽은 현재 수를 더하지 않는 케이스 오른쪽은 현재 수를 더하는 케이스이다.
아래 그림과 같이 백트래킹 방식을 이용해 모든 경우를 탐색한 뒤 합이 S가 되는 부분 수열의 개수를 카운트하면 된다.
void recur(int cur, int total){
if(cur == n){
if(total == s) cnt++;
return;
}
recur(cur + 1, total); // 현재 수를 더하지 않는다.
recur(cur + 1, total + arr[cur]); // 현재 수를 더한다.
}
단, s가 0인 케이스는 모든 경우를 선택하지 않는 공집합을 하나 빼 주어야 한다.
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> s;
for(int i = 0; i < n; i++)
cin >> arr[i];
recur(0, 0);
if(s == 0) cnt--; // 공집합 제거
cout << cnt;
return 0;
}
#CODE
#include <bits/stdc++.h>
using namespace std;
int n, s;
int cnt = 0;
int arr[30];
void recur(int cur, int total){
if(cur == n){
if(total == s) cnt++;
return;
}
recur(cur + 1, total); // 현재 수를 더하지 않는다.
recur(cur + 1, total + arr[cur]); // 현재 수를 더한다.
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> s;
for(int i = 0; i < n; i++)
cin >> arr[i];
recur(0, 0);
if(s == 0) cnt--; // 공집합 제거
cout << cnt;
return 0;
}
반응형
'Archive2 > ProblemSolving' 카테고리의 다른 글
[BOJ] C++ 15663 "N과 M(9)" 문제 풀이 _ nov (0) | 2022.04.15 |
---|---|
[BOJ] C++ 2448 "별 찍기 - 11" 문제 풀이 _ nov (0) | 2022.04.14 |
[BOJ] C++ 15652 "N과 M(4)" 문제 풀이 _ nov (0) | 2022.04.11 |
[BOJ] C++ 2447 "별 찍기" 문제 풀이 _ nov (0) | 2022.04.06 |
[BOJ] C++ 2630 "색종이 만들기" 문제 풀이 _ nov (0) | 2022.04.05 |