LeetCode面试题 08.11. 硬币

题目

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 链接

背包问题

外层循环硬币,内层循环容量

public int waysToChange(int n) {
     int[][] dp=new int[4][n+1];
     int[] coins={1,5,10,25};
	//1分硬币对任何金额都是一种情况
     for(int i=0;i<=n;i++){
         dp[0][i]=1;
     }
     //金额为0对任何硬币都是一种情况
     for(int i=0;i<4;i++){
         dp[i][0]=1;
     }
     for(int i=1;i<4;i++){
         for(int j=1;j<=n;j++){
         	 //面额为coins[i]的硬币可选
             if(j>=coins[i])
                 dp[i][j]=(dp[i-1][j]+dp[i][j-coins[i]])%1000000007;
             else
                 dp[i][j]=dp[i-1][j];
         }
     }
     return dp[3][n];
 }

空间优化

public int waysToChange(int n) {
        if (n == 0) {
            return 1;
        }
        int[] coins = new int[]{1, 5, 10, 25};
        int[] dp = new int[n + 1];
        Arrays.fill(dp,1);
        for (int i = 1; i < 4; i++) {
            for (int j = 1; j <= n; j++) {
                if (j >= coins[i]) {
                    dp[j] = (dp[j] + dp[j - coins[i]]) % 1000000007;
                }
            }
        }

        return dp[n];
    }

你可能感兴趣的:(LeetCode题目)