zoukankan      html  css  js  c++  java
  • [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];
        }
    };
  • 相关阅读:
    面向对象总结
    面向对象进阶
    day21
    组合、封装、多态
    作业20
    继承、派生、新式类与经典类
    作业
    面向对象基础
    代码统计小程序
    使用WampServer搭建本地PHP环境,绑定域名,配置伪静态
  • 原文地址:https://www.cnblogs.com/ech2o/p/12445190.html
Copyright © 2011-2022 走看看