518. Coin Change 2

有一阵没写这道题,愣了一阵子。
刚开始在考虑用BFS来解,后来意识到这是不是求最少有多少个硬币而是有多少种。
而且是个combination而不是permutation
这种问题用dfs肯定可以做,但这种求有多少种的问题用DFS就不明智了。
这种一般是用DP来做
dp[i][j]的状态定义: 用前j种硬币组成i块钱时有多少种可能性。
这里要想一下,dp[i][j]一定要用上所有j种硬币吗?想了一下感觉没有必要加这个限制

induction rule
dp[i][j] = d[i][j - 1] 再加上下面的
如果i >= coin[j] 的话, 则再加上dp[i - coin[j]][j]. 取了一个coins[j] , 然后还可以继续取。
初始化时
dp[0][] = 1;
dp[
> 0][0] = 0;
代码见下:

public int change(int amount, int[] coins) {
        //dp[i][j] 组成 i 块钱, 用 前j种币 
        int M = coins.length;
        int[][] dp = new int[amount + 1][M + 1];
        // dp[0][*] = 1;
        for (int j = 0; j <= M; j++) dp[0][j] = 1;
        //dp[*][0] = 0; * > 0
        for (int i = 1; i <= amount; i++) {
            for (int j = 1; j <= M; j++) {
                dp[i][j] = dp[i][j - 1];
                if (i >= coins[j - 1]) dp[i][j] += dp[i - coins[j - 1]][j];
            }
        }
        return dp[amount][M];
    }

你可能感兴趣的:(518. Coin Change 2)