LeetCode之Coin Change 和 Coin Change 2

14 篇文章 2 订阅
1 篇文章 0 订阅

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];
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值