1
원,2
원,5
원짜리 동전이 있고 원을 만들고자 할 경우,
경우의 수는 아래 경우의 수들의 합이 된다.
1.dp[j-1]
(j-1
원을 만드는 경우의 수) +1
(1
원짜리 동전 추가)
2.dp[j-2]
(j-2
원을 만드는 경우의 수) +1
(2
원짜리 동전 추가)
3.dp[j-5]
(j-5
원을 만드는 경우의 수) +1
(5
원짜리 동전 추가)
0원을 만드는 경우는 아무 동전을 합하지 않는 경우 하나이므로,
dp[0] = 1
로 초기화하고 를 까지 늘려가며dp
를 채운다.
알고리즘을 이해했다면 코드 설명은 따로 필요없어 생략한다.
#include <iostream>
using namespace std;
int n,k;
int coin[101];
int dp[10'001];
void INPUT()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> k;
for(int i = 0; i < n; i++)
cin >> coin[i];
}
void SOLVE()
{
dp[0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = 1; j <= k; j++)
{
// 모든 동전의 가치는 0원 이상
if(j - coin[i] >= 0)
dp[j] += dp[j - coin[i]];
}
}
cout << dp[k];
}
int main()
{
INPUT();
SOLVE();
}
어떤 문제든 one try AC를 받으면 기분이 좋다!!😇