ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Minimum Coin Change Problem
    카테고리 없음 2019. 12. 4. 20:07
    728x90

    Minimum Coin Change Problem 은, 아래의 가정에서, 최소 동전의 숫자를 찾는 문제입니다.

    • 몇개의 동전 종류가 있고 S
    • 동전 종류의 수는 M
    • 만들어야할 잔돈 change

    문제 자체는 아래링크에 잘 설명되어 있습니다.
    https://algorithms.tutorialhorizon.com/dynamic-programming-minimum-coin-change-problem/

    좀 무식한 방법으로 recusion으로 풀어 보면 아래와 같습니다.
    github 에서 보실분은 → Java Source Click!!

    package com.tistory.skysign.MITOpenCourseWare.R5_Dynamic_Programming;
    
    import java.util.ArrayList;
    
    // 동전의 조합(1, 3, 5 ...)이 주어졌을 때,
    // 특정 잔돈(change)을 만들 때, 가장 적은 동전의 갯수로
    // 원하는 잔돈을 만드는 방법에 대해서 알아 보겠습니다.
    
    // 가정
    // 각 동전의 개수는 무한함
    // 동전의 종류가 오름차순(Ascending order)로 정렬되어 있음
    // 동전의 조합에 첫번째 코인은 무조건 1임
    
    // 첫 동전이 1인 것은 매우 중요합니다. 왜냐하면, 1이 있으면, 어떤 잔돈이든 만들 수 있지만,
    // 첫 동전이 1이
    public class MC_min_numberOfCoins {
        int mChange;
    
        // 디버깅및 로그 프린트를 위한 함수 입니다.
        public void d0(int numOfCoins, ArrayList<Integer> cp) {
            if (numOfCoins != cp.size()) {
                System.out.printf("bug -_-;\n");
            }
            else {
                System.out.printf("Num of Coins : %d \n", numOfCoins);
            }
            int sum = 0;
            for(int c : cp) {
                System.out.printf("%3d ", c);
                sum += c;
            }
            System.out.printf(" sum:%d %s\n", sum, (mChange == sum)? "Found": "failed");
        }
    
        public int makeChange(int[] S, int M, int change, int numOfCoins, ArrayList<Integer> cp) {
            if (change < 0) {
                d0(numOfCoins, cp);
                cp.clear();
                cp = null;
                return Integer.MAX_VALUE;
            }
    
            if (0 == change) {
                d0(numOfCoins, cp);
                cp.clear();
                cp = null;
                return numOfCoins;
            }
    
            int r = Integer.MAX_VALUE;
    
            ++numOfCoins;
            for(int i=0; i<M; ++i) {
                ArrayList<Integer> cp2 = new ArrayList<>(cp);
                cp2.add(S[i]);
    
                r = Math.min(r,
                        makeChange(S, M, change - S[i], numOfCoins, cp2));
            }
    
            cp.clear();
            cp = null;
    
            return r;
        }
    
        // S 동전의 종류 배열
        // M 동전 종류의 갯수
        // change 원하는 잔돈
        public int MC(int[] S, int M, int change) {
            mChange = change;
            return makeChange(S, M, change, 0, new ArrayList<Integer>());
    //        int r = Integer.MAX_VALUE;
    //
    //        for(int i=0; i<M; ++i) {
    //            // cp 변수는 실제로 문제를 푸는대 필요한 변수는 아닙니다.
    //            // 리커전으로 호출 될 때, 동전이 어떻게 추가 되는지 보기 위한 변수일 뿐입니다.
    //            // 참고로, 변수이름 cp 는 coin permutation 의 약자로 코인 순열을 뜻합니다.
    //            ArrayList<Integer> cp = new ArrayList<>();
    //            cp.add(S[i]);
    //            r = Math.min(r,
    //                    makeChange(S, M, change - S[i], numOfCoins, cp));
    //        }
        }
    
        public static void main(String[] args) {
    //        int[] S = {1, 5, 10};
    //        int M = S.length;
    //        int change = 3;
    
    //        int[] S = {1, 5, 10};
    //        int M = S.length;
    //        int change = 7;
    
            int[] S = {1, 5, 10};
            int M = S.length;
            int change = 13;
    
            int r;
    
            MC_min_numberOfCoins mc = new MC_min_numberOfCoins();
            r = mc.MC(S, M, change);
            System.out.println();
            System.out.println(r);
        }
    }
    728x90
Designed by Tistory.