부분수열의 합
문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
이번문제는 백트레킹! 부분수열의 합 입니다.
n개의 원소중에서 m개를 뽑았을때 합이 S 이면 결과값을 늘려나가는 방법을 이용했습니다.
여기서 m개의 범위는 1 <= m <=n 으로 하였습니다.
기본적으로 nCm (1<=m<=n) 일때 결과값이 S인 것을 찾는다고 생각하면 좋을것 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int n, m; int a[20]; vector<int> v; int check[20]; int ans; void dfs(int depth, int next, int k) { if (depth == k) { int sum = 0; for (int i = 0; i < n; i++) sum += a[i]; if (sum == m) ans++; return; } for (int i = next; i < n; i++) { if (!check[i]) { check[i] = true; a[depth] = v[i]; dfs(depth + 1, i + 1, k); check[i] = false; } } } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { int k; cin >> k; v.push_back(k); } for(int i=1;i<=n;i++) dfs(0, 0, i); cout << ans; return 0; } | cs |
'Programming > Algorithm' 카테고리의 다른 글
[graph theory, BOJ-1753] 최단경로, c++ (0) | 2021.04.26 |
---|---|
[graph theory, BOJ - 14502] 연구소, c++ (0) | 2021.04.25 |
[backtracking, BOJ - 6603] 로또, c++ (0) | 2021.04.22 |
[backtracking, BOJ - 14888] 연산자 끼워넣기, C++ (0) | 2021.04.21 |
[backtracking, BOJ - 15652] N과 M (4), C++ (0) | 2021.04.20 |