【LEETCODE】76、面试题 08.11. 硬币

package dynamicprogramming.medium;

/**
 * @Auther: xiaof
 * @Date: 2020/4/23 09:17
 * @Description:面试题 08.11. 硬币
 * 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
 *
 * 示例1:
 *  输入: n = 5
 *  输出:2
 *  解释: 有两种方式可以凑成总金额:
 * 5=5
 * 5=1+1+1+1+1
 * 示例2:
 *  输入: n = 10
 *  输出:4
 *  解释: 有四种方式可以凑成总金额:
 * 10=10
 * 10=5+5
 * 10=5+1+1+1+1+1
 * 10=1+1+1+1+1+1+1+1+1+1
 * 说明:
 * 注意:
 * 你可以假设:
 * 0 <= n (总金额) <= 1000000
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/coin-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class WaysToChange {

    /**
     *
     * 功能描述: 
     *执行用时 : 46 ms , 在所有 Java 提交中击败了 34.42% 的用户
     * 内存消耗 : 43.8 MB , 在所有 Java 提交中击败了 100.00% 的用户
     * @author: xiaof
     * @date: 2020/4/23 9:41
     * @Description: 
     */
    public int solution(int n) {
        //动态规划,f(n)=f(n-{1,5,10,25}) + x,
        int[] res = new int[n + 1], money = new int[]{1,5,10,25};
        res[0] = 0; res[1] = 1;
        for (int j : money) {
            for (int i = 2; i <= n; ++i) {
                if (i > j) {
                    res[i] = (res[i] + res[i - j]) % 1000000007;
                } else if (i == j) {
                    res[i] += 1;
                }
            }
        }

        return res[n];
    }

    public static void main(String[] args) {
        WaysToChange fuc = new WaysToChange();

        int n1 = 10;
        int n2 = 900750;

        fuc.solution(n2);
    }
}

少见的能自己做出来的leetcode中等难度的题。。。。加油,奥利给

 

posted @ 2020-04-23 09:44  cutter_point  阅读(204)  评论(0编辑  收藏  举报