322. 零钱兑换1 、518零钱兑换2

完全背包问题

1.凑成金额的最少硬币数:最少硬币数,所以dp[0]=0,也就是金额等于0的话,需要的最少硬币数是0,也就是一个都不需要

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

2.凑成金额的组合数:组合数,所以dp[0]=1,因为金额等于0的话,如果我一个硬币也不放,那么这也是一个组合数,所以=1

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
示例 1:
输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

凑成金额的最少硬币数

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount+1];       
        Arrays.fill(dp,amount+1);
        dp[0] = 0;//最少的硬币个数   没有的话是不需要硬币的!!
        for(int i=0;i<coins.length;i++){//物品
            for(int j=coins[i];j<=amount;j++){//容量
                dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);//这里+1相当于背包的价值,因为我放一个的话,价值久+1
            }
        }
        if(dp[amount]==amount+1){
            return -1;
        }
        return dp[amount];
    }
}

凑成金额的组合数

class Solution {
    public int change(int amount, int[] coins) {
        int[] dp = new int[amount+1];
        dp[0] = 1;
        for(int i=0;i<coins.length;i++){
            for(int j=coins[i];j<=amount;j++){
                dp[j] = dp[j] + dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
}

你可能感兴趣的:(322. 零钱兑换1 、518零钱兑换2)