📌 백트래킹이 아닌가…ㅜㅜ라는 생각이 든 당신! → DP를 떠올려라!
📌 점화식 찾기 == 직접 해보면서 규칙 찾기
모든 경우의 수를 세면서 (0, 0, 0) , (0, 0, 1), (0, 0, 2) … 로 센다면 시간초과 발생
→ DP 문제임
1. 테이블 정의하기
d[k] = 가치 합이 k일때의 경우의 수
2. 점화식 세우기
d[k] = d[k- arr[0]] + d[k-arr[1]] + … + d[k-arr[N-1]]
But k가 동전의 가치 이상일때만 점화식을 세울 수 있음
→ 동전의 가치에 따라 테이블의 값이 달라짐
→ 동전의 가치를 기준으로 테이블에 값을 채워가자
for (int i=0; i<arr.size(); i++){
for (int k=arr[i]; k<=K; k++)
d[k] += d[k-arr[i]];
}
3. 초기값 설정
0이 되는 방법은 모든 동전을 사용하지 않는 경우의 수이므로 d[0] = 1
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int N, K;
cin >> N >> K;
vector<int> arr(N);
vector<int> d(K+1, 0);
for (int i=0; i<N; i++) cin >> arr[i];
sort(arr.begin(), arr.end());
d[0] = 1;
for (int i=0; i<arr.size(); i++){
for (int k=arr[i]; k <= K; k++){
d[k] += d[k-arr[i]];
}
}
cout << d[K];
//for (int i=0; i<=K; i++) cout << d[i] <<' ';
return 0;
}