动态规划
public int coinChange(int[] coins, int amount) {int max = amount + 1; //这里最大值为amountint[] dp = new int[amount + 1];//dp[i]=j表示组成金额为i所需最少硬币为jArrays.fill(dp, max);dp[0] = 0;for (int i = 1; i <= amount; i++) { //遍历求dpfor (int j = 0; j < coins.length; j++) { //遍历每一种硬币金额if (coins[j] <= i) { //如果该硬币金额小于等于需要组成的金额//dp[i - coins[j]] + 1 表示使用该硬币组成dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}}//判断是否发生了更新return dp[amount] > amount ? -1 : dp[amount];}

