알고리즘/백준
BOJ 2293. 동전 1
아헿헿헿
2022. 7. 16. 19:28
BOJ 2293. 동전 1
랭크 : 골드5
문제 풀이
dp를 통해 k 범위에 가능한 수를 중첩해나가면 됩니다. 메모리 제한 때문에 벡터를 2개 사용해서 스왑해서 사용하고, 동전을 여러개 쓸 수 있으니 k 범위를 벗어날 때까지 하나씩 늘려서 사용하는 경우의 수를 고려해줍니다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int n, k, tmp, adding;
int main() {
fastio;
cin >> n >> k;
vector<int> arr1(10001, 0);
vector<int> arr2(10001, 0);
arr1[0] = 1;
for (int i=0; i < n; i++) {
cin >> tmp;
arr2 = arr1;
adding = tmp;
while (adding <= k) {
for (int j=0; j <= k - adding; j++)
arr2[j + adding] += arr1[j];
adding += tmp;
}
swap(arr1, arr2);
}
cout << arr1[k] << endl;
}
알고리즘 |
시간복잡도 |
공간복잡도 |
---|---|---|
dp | $O(N * k)$ | $O(k)$ |