https://leetcode.com/problems/coin-change-ii/

코드설명

동적계획법(Dynamic Programming) + 깊이우선탐색(DFS) 을 활용합니다.

 

이 문제가 동적계획법, 즉 최적부분구조가 성립하는 이유를 예제1로 예시를 들어보겠습니다.

Example 1:

Input: amount = 5, coins = [1,2,5]
Output: 4
Explanation: there are four ways to make up the amount:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

1원으로 만들 수 있는 경우.

1원 = 1 = 1가지

2원 = 1 + 1 = 1가지

3원 = 1 + 1 + 1 = 1가지 

 

2원으로 만들 수 있는경우

2원 = 2 = 1 가지

3원 = (3- 2원) = 1원으로써  = 1가지 (1 + 2) 입니다.

 

최종적으로 3원은 = {1 + 1 + 1, 1 + 2} 입니다.

코드

class Solution {
    int[] Coins;
    int[][] cache = new int[301][5001];
    int Amount;
    public int change(int amount, int[] coins) {
        Coins = coins;
        Amount = amount;
        for(int[] v : cache){
            Arrays.fill(v, -1);
        }
        return DFS(0, amount);
    }

    int DFS(int idx, int money){
        if(money == 0) return 1;
        if(idx == Coins.length) return 0;
        if(cache[idx][money] != -1) return cache[idx][money];

        int ret = 0;
        if(money - Coins[idx] >= 0){
            ret += DFS(idx, money - Coins[idx]);
        }
        ret += DFS(idx + 1, money);

        return cache[idx][money] = ret;
    }
}

+ Recent posts