[LeetCode] 322. Coin Change 零钱兑换

题目:


 在刚看到题目时,很自然的想到了利用dfs,穷举所有的可能性,虽然知道有可能超时,但还是做了...果然超时了

随后看了题解,利用动态规划(自下而上)特别清晰

分析:

定义F(i) 表示组成i元钱需要的最小次数

那么便有,

F(0)=0

最终的目标便是求得F(amount)

不同状态之间的转移公式是   F(i) = min(F(i-Cj)) + 10=<j<coins.size()  其中Cj代表硬币面值的第j个取值,如果出现i-Cj<0,直接忽略

在求F(i)时,只需知道各个F(i-Cj),而F(i-Cj)在i之前便是已知的了,所以是可以计算的

代码:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> F(amount+1, amount);
        F[0] = 0;
        for(int i=1; i<=amount; i++){
            int cur=INT_MAX;
            for(int j=0; j<coins.size(); j++){
                if(i-coins[j]<0)    continue;
                else if(F[i-coins[j]]>=0 && cur > F[i-coins[j]] )   cur = F[i-coins[j]]+1;
            }
            F[i] = cur == INT_MAX?-1:cur;
        }
        return F[amount];
    }
};

猜你喜欢

转载自www.cnblogs.com/ech2o/p/12445190.html
今日推荐