동전 n
개를 한 번에 계산하려니까 안 풀린 문제.. 하나씩 생각해야 한다.
dp
에는 해당 인덱스만큼 값을 동전으로 만들 수 있는 경우의 수이다. 즉 dp[k]
는 답이 된다.dp[0]
은 값이 0이므로 아무것도 넣지 않는 경우의 수 1
dp[j-arr[i]]
를 더해준다.3
으로 값 5
를 만든다고 하면, dp[5-3]
. 즉, 값 2
인 경우의 수에서 동전 3
을 하나 더해주면 만들 수 있기 때문에 dp[j-arr[i]]
값을 더해주는 것이다.dp[k]
를 출력하면 끝.#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int n, k;
cin >> n >> k;
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
vector<int> dp(k+1);
dp[0] = 1; // 하나도 안 넣는 경우의 수
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= k; j++)
{
if (arr[i] > j) continue;
dp[j] += dp[j - arr[i]];
}
}
cout << dp[k] << endl;
return 0;
}