zoukankan      html  css  js  c++  java
  • LeetCode 518. Coin Change 2(零钱兑换 II)

    LeetCode 518. Coin Change 2(零钱兑换 II)

    题目

    链接

    https://leetcode-cn.com/problems/coin-change-2
    

    问题描述

    给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

    示例

    输入: amount = 5, coins = [1, 2, 5]
    输出: 4
    解释: 有四种方式可以凑成总金额:
    5=5
    5=2+2+1
    5=2+1+1+1
    5=1+1+1+1+1
    

    提示

    0 <= amount (总金额) <= 5000
    1 <= coin (硬币面额) <= 5000
    硬币种类不超过 500 种
    结果符合 32 位符号整数
    

    思路

    动态规划问题,思路有所改变,dp[0]=1,表示要得到0价值只有一种方法,外层循环用于检测硬币,内层循环用于检测数值,假设硬币有12两种,需要求的值是3,在第一次外层循环就可以得到dp[3]=dp[2]=dp[1]=dp[0]=1,之后第二次外层循环用于检测硬币2,发现dp[3] += dp[3-2],这里代表1+2两枚,最后答案是dp[3] = 2

    复杂度分析

    时间复杂度 O(n*amount)
    空间复杂度 O(amount)
    

    代码

    C++

    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount + 1);
        dp[0] = 1;
        for (auto& coin : coins) {
            for (int i = coin; i <= amount; i++) {
                dp[i] += dp[i - coin];
            }
        }
        return dp[amount];
    }
    
    
  • 相关阅读:
    使用PaintCode便捷地实现动画效果
    程序员常用markdown语法记忆小结之博客园markdown编辑器的效果
    kafka-重复消费-1
    nosql
    ThreadLocal
    内存溢出、内存泄漏
    springboot邮件服务
    三次握手、四次挥手
    悲观锁乐观锁简单整理
    beanstalkd
  • 原文地址:https://www.cnblogs.com/blogxjc/p/14871103.html
Copyright © 2011-2022 走看看