C++换硬币动态规划

669. 换硬币
中文English
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 
如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.
样例
样例1
输入:
[1, 2, 5]
11
输出: 3
解释: 11 = 5 + 5 + 1
样例2
输入: 
[2]
3
输出: -1
注意事项
你可以假设每种硬币均有无数个
class Solution {
public:
    /**
     * @param A: a list of integer
     * @param M: a total amount of money amount
     * @return: the fewest number of coins that you need to make up
     */
    int coinChange(vector<int> &A, int M) {
        // write your code here
        //new 出来一个v数组
        int *v = new int[M + 1] ;
        //获取硬币个数
        int n = A.size();
        v[0] = 0; 
        //0元需要0枚硬币 理所应当这里应该人为定义ta为0(也就是转移方程算不出的手工定义)
        for(int i=1;i<=M;i++){
            //每次初始化当前硬币的值为无穷大,如果能够拼出,下面就会更新ta的值
            //也就是每次我们都假设当前硬币不能够拼出
            v[i] = INT_MAX;
            //拼出i所需要的最少硬币数
            // v[i] = min(v[i - A[j]] + 1, , , v[i - A[n - 1]] + 1)
            
            //枚举最后一个硬币的情况
            for(int j = 0; j < n; j++){
            	//这里是控制边界
                if(i >= A[j] && v[i - A[j]] != INT_MAX){
                    v[i] = min(v[i - A[j]] + 1, v[i]);
                }
            }
        }
        //如果拼到最后还是无穷大说明拼不出这个总额
        if(v[M] == INT_MAX){
            v[M] = -1;
        }
        return v[M];
    }
};

你可能感兴趣的:(C++算法题解)