面试题 08.11. 硬币

1.状态定义

dp[i]表示组成面额 i,有多少种方案。

2.状态转移方程

int[] coins = new int[]{1,5,10,25};

for(int coin: coins) {

     dp[k] += dp[k - coin];

}

比如dp[36] = dp[36-1] + dp[36 - 5] + dp[36-10] + dp[36-25]

3.边界处理

dp[0] = 1.

 

先遍历硬币,避免coin(6) = 1 + 5 和coin(6) = 5 + 1 情况。

面试题 08.11. 硬币

class Solution {
    public int waysToChange(int n) {
        int[] dp = new int[n + 1];
        int[] coins = new int[]{1,5,10,25};
        dp[0] = 1;
        for(int coin : coins)
            for(int i = coin; i <= n; i++)
                dp[i] = (dp[i] + dp[i - coin]) % 1000000007;
        return dp[n];
    }
}

 

posted @ 2021-04-22 19:45  星予  阅读(50)  评论(0编辑  收藏  举报