leetcode 322. 零钱兑换 标准dp

题目描述

思路

有用回溯做的,但是此题是标准的dp问题。

dp[i] 表示i金钱需要最少零钱数目。

伪代码
for 0 ~ amount 
    for coin : coins
        dp[i] = min(dp[i],dp[i-coin]);

return dp[amount]==amount+1? -1:dp[amount] //判断是否能兑换

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,amount+1); //dp【i】表示i需要最少硬币
        dp[0] = 0;
        for(int i=0;i<=amount;i++)
        {
            for(auto coin:coins)
            {
                if(i-coin<0)
                    continue;
                dp[i] = min(dp[i],1+dp[i-coin]);
            }
            //cout<<dp[i]<<"\t";
        }
        return dp[amount]==amount+1 ? -1:dp[amount];
    }
};

重难点

记得初始化dp[0] = 0,否则数组内容全为max。

发布了184 篇原创文章 · 获赞 62 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_23301703/article/details/105481954
今日推荐