leetcode 322.零钱兑换

322.零钱兑换

记录一下我唯一能看懂的一种解法:

dp 数组迭代解法

由于每一种面值的硬币数量不限,所以该问题时一个动态规划问题,解决思路是定义一个dp数组,其中dp[i]表示凑成金额i所需要的最少硬币数量。
若给定的面值数组为coins[1,2,5],需要的金额amount=11则可以将dp数组初始化为

01212121212121212121212

dp[0]=0是因为组成面值为0至少需要0个硬币数量,由于组成其他金额所需要的硬币数量最多不会超过amount的值(即全部用1元硬币凑),将初始值设置为amount+1方便迭代求出每一个金额所需要硬币的最小数量。

在求每一种金额所需的最小硬币数量dp[i]时,要利用前面所求的结果dp[0]~dp[i-1],例如已知组成10元所需的最少硬币数,且当前给定的面值里面有1元面值,则组成11元所需的最少硬币数=组成10元所需的最少硬币数+1

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,amount+1);
        dp[0]=0;
        for(int i=0;i<amount+1;i++)//0~amount
        {
            for(int coin:coins)
            {
                if(i-coin>=0)
                    dp[i]=min(dp[i],1+dp[i-coin]);
            }
        }
        if(dp[amount]!=amount+1)
            return dp[amount];
        return -1;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值