美文网首页
518. Coin Change 2

518. Coin Change 2

作者: 尚无花名 | 来源:发表于2019-04-28 02:31 被阅读0次

    有一阵没写这道题,愣了一阵子。
    刚开始在考虑用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

          本文链接:https://www.haomeiwen.com/subject/uklrnqtx.html