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]; } }