LeetCode 322. 零钱兑换 完全背包

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

示例 1:

输入: coins = [1, 2, 5], amount = 11

输出: 
3
 
解释: 11 = 5 + 5 + 1

示例 2:

输入: coins = [2], amount = 3

思路:

因为每种钱币可以无限次用,dpj代表凑成j所需要的最小数目,那么我们可写成dpj=min(dp[j],dp[j-coins[i]]+1),代表选与不选第i个。

代码:

class Solution {
public:
    int dp[100000];
    int coinChange(vector<int>& coins, int amount) {
        for(int i=0;i<=10000-1;i++)dp[i]=99999999;
        dp[0]=0;
        for(int i=0;i<coins.size();i++)
        {
            for(int j=coins[i];j<=amount;j++)
            {
                dp[j]=min(dp[j],dp[j-coins[i]]+1);
            }
        }
        return dp[amount]==99999999?-1:dp[amount];
    }
};
发布了1062 篇原创文章 · 获赞 72 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/104911609
今日推荐