/* * 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]; }