LeetCode之Coin Change 和 Coin Change 2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hf19931101/article/details/79432618

1.Coin Change

LeeCode链接:https://leetcode.com/problems/coin-change/description/

你有不同面额的硬币和总金额。写一个函数来计算你所需要的最少的硬币数。如果这笔钱不能由硬币的任何组合构成,则返回-1。

Example 1:

coins = [1, 2, 5], amount = 11

return 3 (11 = 5 + 5 + 1)

Example 2:

coins = [2], amount = 3

return -1.

Note:
你可以假设每种硬币都有无数个

int min(int a, int b)
{
    return a <= b ? a : b;
}
int coinChange(vector<int>& coins, int amount) 
{
    int MAX = 1 << 30;
    //dp[x]表示总面值为x所需的最少硬币数
    //每一个元素都初始为MAX,如果最后无解则dp[amount]==MAX
    vector<int> dp(amount + 1, MAX);
    dp[0] = 0; //总金额为0时需要0个硬币

    //注意:可以将里外层循坏互换,不影响结果
    //求出总金额从1到amount所需的最少硬币数
    for (int i = 1; i <= amount; i++)
    {
        //本轮循环只使用第j种硬币,但是dp[]中保存的信息是使用前j-1种硬币对应金额所需的最少硬币数
        for (int j=0; j<coins.size(); j++)
        {
            if (i>=coins[j])
            {
                dp[i] = min(dp[i], dp[i - coins[j]] + 1);
            }
        }
    }
    return dp[amount] == MAX ? -1 : dp[amount];
}

2.Coin Change 2

LeeCode链接:https://leetcode.com/problems/coin-change-2/description/

你有不同面额的硬币和总金额。编写一个函数来计算构成该总金额的组合数。你可以假设你有有无限数量的每种硬币。

Note: 可以有如下假设

0 <= amount <= 5000

1 <= coin <= 5000

硬币的面值少于 500

答案肯定可以被存储在32位整型变量int中

int change(int amount, vector<int>& coins) 
{
    //dp[x]表示总金额为x时硬币的组合数
    vector<int> dp(amount + 1);
    dp[0] = 1; //当目标面值为0时认为有1种组合方式

    /*注意:不可以将里外层循环互换,否则就出现重复计算,
    比如:如果有硬币{1,2},且aoumut = 3,那么使用2,1和1,2应该算为一种情况
    */
    //使用前i种硬币凑成指定面值
    for (int i=0;i<coins.size();i++)
    {
        //目标面值,从1到amount
        for (int j=1;j<=amount;j++)
        {
            if (j>=coins[i])
            {
                dp[j] += dp[j - coins[i]];
            }
        }
    }
    return dp[amount];
}

猜你喜欢

转载自blog.csdn.net/hf19931101/article/details/79432618
今日推荐