3.零钱兑换-背包问题

题目

给一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。

计算并返回能凑成该整数的最小硬币个数,如果没有任何一种方案能凑成总金额,返回-1

硬币的数量是无限的。

示例1

输入:coins = [1,2,5],amount = 10
输出:3
解释:10 = 5 * 5 * 1;

示例2

输入:coins = [2],amount = 3
输出:-1

示例3

输入:coins = [1],amount = 0
输出:0

思路

对于零钱兑换,可以从0开始遍历需要的硬币数,直到amount金额需要的硬币数。
1.初始条件:dp[0] = 0;
2.转移方程:dp[i] = min(dp[i - coins[j]] + 1, dp[n]);
3.输出dp[amount].

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int initial = amount + 1;
        vector<int> dp(amount + 1, amount + 1);
        dp[0] = 0;
        for(int i = 1; i <= amount; i++){
            for(int j = 0; j < coins.size(); j++){
                if(i - coins[j] >= 0){
                    dp[i] = min(dp[i], dp[i - coins[j]] + 1);
                }
            }
        }
        return dp[amount] == amount + 1 ? -1 : dp[amount];
    }
};
posted @ 2021-08-23 09:30  什么名字比较好  阅读(60)  评论(0)    收藏  举报