Leetcode题解系列——322. Coin Change(c++版)

版权声明: https://blog.csdn.net/dickdick111/article/details/84260350

题目链接:322. Coin Change

题目大意:给出硬币的面值以及所需要的总金额,试图找到最少个数的找钱方式,这里假设硬币的个数都是无限个。

注意点:
1.可能存在无法找零的情况,注意判断。
2.注意动态规划数组的下标是从1开始还是从0开始

一.算法设计

这道也是典型的动态规划题目,不能使用贪心算法来解决。

设置数组dp[i],表达找零总额为i的最少硬币总数。
注意初始化给每一个金额先赋值为MAX值,方便后面判断是否没有找零的情况。

状态转移方程:dp[i] = min(dp[i], dp[i-coins[j]]+1);
表达为遍历所拥有的硬币,查找需要该硬币的前一个dp值+1后是否小于当前dp值,如果是则更换dp值。始终保持dp为当前金额的最小硬币数

判断是否无法找零,是通过对于最后的dp值,如果仍等于MAX值,则证明没有办法找到一个方案找零,返回-1.

二.算法实现

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1);
        int csize = coins.size();
        for(int i = 1; i <= amount; i++) dp[i] = 10000;
        for(int i = 1; i <= amount; i++){
            for(int j = 0; j < csize; j++){
                if(i >= coins[j])
                    dp[i] = min(dp[i], dp[i-coins[j]]+1);
            }
        }
        if(dp[amount] == 10000) return -1;
        else return dp[amount];
    }
};

猜你喜欢

转载自blog.csdn.net/dickdick111/article/details/84260350