Dynamic Programming - making change

后端 未结 4 1916
陌清茗
陌清茗 2020-12-11 05:08

I\'m having trouble figuring out my last section of code for a Dynamic Coin Changing Problem. I have included the code below.

I can\'t figure out the last else

相关标签:
4条回答
  • 2020-12-11 05:41

    You don't need to switch to a greedy algorithm for solving the coin changing problem, you can solve it with a dynamic programming algorithm. For instance, like this:

    public int minChange(int[] denom, int targetAmount) {
    
        int actualAmount;
        int m = denom.length+1;
        int n = targetAmount + 1;
        int inf = Integer.MAX_VALUE-1;
    
        int[][] table = new int[m][n];
        for (int j = 1; j < n; j++)
            table[0][j] = inf;
    
        for (int denomPosition = 1; denomPosition < m; denomPosition++) {
            for (int currentAmount = 1; currentAmount < n; currentAmount++) {
                if (currentAmount - denom[denomPosition-1] >= 0)
                    actualAmount = table[denomPosition][currentAmount - denom[denomPosition-1]];
                else
                    actualAmount = inf;
                table[denomPosition][currentAmount] = Math.min(table[denomPosition-1][currentAmount], 1 + actualAmount);
            }
        }
    
        return table[m-1][n-1];
    
    }
    
    0 讨论(0)
  • 2020-12-11 05:56
    //this works perfectly ...
    
     public int minChange(int[] denom, int targetAmount) 
        {
    
        int actualAmount;
        int m = denom.length+1;
        int n = targetAmount + 1;
        int inf = Integer.MAX_VALUE-1;
    
        int[][] table = new int[m][n];
        for (int j = 1; j < n; j++)
            table[0][j] = inf;
    
        for (int i = 1; i < m; i++) //i denotes denominationIndex
        {
            for (int j = 1; j < n; j++) //j denotes current Amount
            {
                if (j - denom[i-1] >= 0)//take this denomination value and subtract this value from Current amount
    
                    table[i][j] = Math.min(table[i-1][j], 1 + table[i][j - denom[i-1]]);
    
                else
                    table[i][j] = table[i-1][j];
    
            }
        }
    
    
    
    
        //display array
            System.out.println("----------------Displaying the 2-D Matrix(denominations and amount)----------------");
            for (int i = 0; i < m; i++) 
            {
                System.out.println("   ");
                for (int j = 0; j < n; j++) 
                {
                    System.out.print("  "+table[i][j]);
    
                }
                System.out.println("   ");
            }
    
        return table[m-1][n-1];
    
    }
    
    0 讨论(0)
  • 2020-12-11 05:56

    This is actually the correct version of this algorithm.

    public static int minChange(int[] denom, int targetAmount) {
        int actualAmount;
        int m = denom.length + 1;
        int n = targetAmount + 1;
        int inf = Integer.MAX_VALUE - 1;
    
        int[][] table = new int[m][n];
        for(int i = 0; i< m; ++i) {
            for (int j = 1; j < n; j++) {
                table[i][j] = inf;
            }
        }
    
        for (int denomPosition = 1; denomPosition < m; denomPosition++) {
            for (int currentAmount = 1; currentAmount < n; currentAmount++) {
                if (denom[denomPosition-1] <= currentAmount) {
                    // take
                    actualAmount = table[denomPosition][currentAmount - denom[denomPosition-1]];
                }
                else {
                    actualAmount = inf;
                }                                              // do not take
                table[denomPosition][currentAmount] = Math.min(table[denomPosition-1][currentAmount], 1 + actualAmount);
            }
        }
    
        return table[m-1][n-1];
    }
    
    0 讨论(0)
  • 2020-12-11 05:58

    Are you over thinking this? If we were trying to give 68 cents change using U.S. coins…

    Would ‘denom’ be { 25, 10, 5, 1 } ?

    And wouldn’t the answer be “2 quarters, 1 dime, 1 nickel, and 3 pennies” = ‘2 + 1 + 1 + 3 = 7’? So the function should return the value 7. Right?

    0 讨论(0)
提交回复
热议问题