// [백준] 2293. 동전 1 (Kotlin)
import java.util.*
fun main() = with(Scanner(System.`in`)){
val n = nextInt()
val k = nextInt()
val dp = Array(10001){0}
val coin = Array(n){0}
dp[0] = 1
for(i in 0 until n){
coin[i] = nextInt()
}
for(i in 0 until n){
for(j in coin[i] .. k){
dp[j] += dp[j - coin[i]]
}
}
println(dp[k])
}
DP 문제로, 점화식을 떠올려보다가 떠오르지 않아서 다른사람들의 풀이를 참고하여 풀었다.
DP[n] = x (n을 만들 수 있는 경우의 수 = x)
로 DP에 저장한다.
예제처럼
n=3, k=10
1
2
5
의 값이 들어왔다면
동전에 대하여 각각 그 동전을 사용하여 만들 수 있는 경우를 더해준다.
1을 사용하여 1을 만들려면 1을 1개 사용하면 되고, (dp[1])
1을 사용하여 2를 만들려면 이미 1이 존재할 때 1을 사용하면 되고, (dp[2] += dp[1])
1을 사용하여 3을 만들려면 이미 2가 존재할 때 1을 사용하면 된다. (dp[3] += dp[2])