322. Coin Change

    /*
     * 322. Coin Change
     * 2016-7-6 by Mingyang
     * 这道题目的思路是一个一维的dp,自己想出来了,从后往前倒着推,比如有5,2,1三种选择
     * 那么从最后一个往前推就是dp[n-5],dp[n-2],dp[n-1]的最小值再加1
     * 不过有些细节方面需要注意一下,首先我所有的dp都设为0是不对的,因为比如coin是2,我是3
     * 找不到的时候我还是会用dp[1]+1这么就错了,所以网上用了INF来表示没有
     * 那么在dp过程中,在我比coin大,而且那个我减去coin剩下的可以成功换钱的情况下,我再递进
     */
      public int coinChange(int[] coins, int amount) {
            int dp[] = new int[amount + 1];
            final int INF = 0x7ffffffe;
            for (int i = 1; i <= amount; i++) dp[i] = INF;
            dp[0]=0;
            for (int i = 1; i <= amount; i++) {
                for (int j = 0; j < coins.length; j++) {
                     if(coins[j]<=i&&dp[i-coins[j]]!=INF)
                        dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);
                }
            }
            return dp[amount] == INF ? -1 : dp[amount];
        }    
原文地址:https://www.cnblogs.com/zmyvszk/p/5649512.html