518. 零钱兑换 II

518. 零钱兑换 II

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

示例 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

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10] 
输出:1

这道题的思路是定义一个二维数组dp[i][j],用来表示前i种硬币来组成面额为j的组成方案数。那么对于每种硬币coin都有选或者不选两种选择,如果选择的话,dp[i][j]=dp[i-1][j]+dp[i][j-coin]。如果不选择,那dp[i][j]=dp[i-1][j]。而且这里的状态转移方程是i>=1的,j>=coin的,所以要有初始化,判断,具体看代码就行了。

代码如下:

int change(int amount, int* coins, int coinsSize) {
    if(amount&1){
        int t=1;
        for(int i=0;i=coins[i]){
                dp[i][j]=dp[i-1][j]+dp[i][j-coins[i]];
            }else{
                dp[i][j]=dp[i-1][j];
            }
        }
    }
    return dp[coinsSize-1][amount];
}

代码中第一个if是因为测试案例中有一个爆出int的测试案例,amount是奇数,而coins数组中的数据都是偶数,所以可以直接判断。

你可能感兴趣的:(算法,leetcode)