zoukankan      html  css  js  c++  java
  • LeetCode-322-零钱兑换

    LeetCode-322-零钱兑换

    题目

    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1.

    示例 1:
    
    输入: coins = [1, 2, 5], amount = 11
    输出: 3 
    解释: 11 = 5 + 5 + 1
    
    示例 2:
    
    输入: coins = [2], amount = 3
    输出: -1
    

    思路

    第一次看到这道题的时候,没有设定好状态转移方程的自变量,就是dp[i]的i值一开始没找好,所以想了半天没有思路;

    过了一天后发现,可以用i值表示金额,即一块钱一块钱的加上来,每次都找到花费硬币最少的哪个方案即可:

    [dp[i]=min(dp[i-1]+1) ]

    想通了之后发现特别简单,但是没有设定好方程之前就是做不出来。

    最后结果效果不是很好,然后我发现coins排序后,可以在一定程度剪枝,提升了一点点,代码如下:

    代码

    class Solution {
    public:
        const int INFTY = (1<<10);
        int coinChange(vector<int>& coins, int amount) {
            vector<int> dp;
            dp.push_back(0);
            sort(coins.begin(), coins.end());
            for (int i=1; i<amount+1; i++)
            {
                int num = INFTY;    
                for (const int&coin:coins)
                {
                    if (i-coin < 0)
                        break;
                    if (dp[i-coin] < 0)
                        continue;
                    num = min(num, dp[i-coin]);
                }
                dp.push_back((num==INFTY?-1:num+1));
            }
            return dp.back();
        }
    };
    
  • 相关阅读:
    pgfplots画二维图真的很方便,多例比较
    LaTeX技巧206:使用gather输入多行公式的技巧
    LaTeX技巧205:使用split输入多行公式技巧
    LaTeX技巧207:使用align环境输入多行公式的技巧
    LaTeX技巧24:LaTeX常用命令集锦
    CTEX
    Latex常用指令学习
    LATEX数学公式基本语法
    LaTeX使用技巧
    C 命令行参数
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13066487.html
Copyright © 2011-2022 走看看