zoukankan      html  css  js  c++  java
  • 刷题-力扣-518. 零钱兑换 II

    518. 零钱兑换 II

    题目链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/coin-change-2/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目描述

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

    示例 1:

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

    示例 2:

    输入: amount = 3, coins = [2]
    输出: 0
    解释: 只用面额2的硬币不能凑成总金额3。
    

    示例 3:

    输入: amount = 10, coins = [10] 
    输出: 1
    

    注意:
    你可以假设:

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

    题目分析

    1. 根据题目描述计算总价值等于amount的硬币组合数
    2. dp[i]表示金额等于i的硬币组合数
    3. 若存在硬币金额为coin,有i>coin。如存在一种硬币组合等于i-coin,则在dp[i-coin]上加上一种硬币coin就可得到金额等于i的硬币组合

    代码

    class Solution {
    public:
        int change(int amount, vector<int>& coins) {
            sort(coins.begin(), coins.end(), compare);
            vector<int> dp(amount + 1, 0);
            dp[0] = 1;
            for (auto coin : coins) {
                for (int i = coin; i <= amount; ++i) {
                    dp[i] += dp[i - coin];
                }
            }
            return dp[amount];
        }
    
    private:
        static bool compare(int a, int b) {
            return a < b;
        }
    };
    
  • 相关阅读:
    Linux 之 文件压缩解压
    Linux 之 文件搜索命令
    Linux 之 文件内容查看
    Linux 之 Vim常用命令
    Linux 之 CentOS练习
    CentOS找不到想要的镜像版本?
    Swoole 简单学习(2)
    Swoole 简单学习
    svn的简单知识
    8、16、32-BIT系列单片机区别与特点
  • 原文地址:https://www.cnblogs.com/HanYG/p/14870745.html
Copyright © 2011-2022 走看看