322. Coin Change(C++实现)

来源:互联网 发布:淘宝如何预约快递 编辑:程序博客网 时间:2024/05/22 05:11

递归算法:

class Solution {        int *dp;    vector<int> a;        int dfs(int S)    {        if(dp[S]!=-2) return dp[S];                int ans=-1;                for(int i=0;i<a.size();i++)        {            const int w=a[i];            if(S<w) continue;                        int tmp=dfs(S-w);            if(tmp!=-1)            {                tmp+=1;                if(ans==-1||ans>tmp) ans=tmp;            }        }        return dp[S]=ans;    }    public:    int coinChange(vector<int>& coins, int amount) {if(amount==0)return 0;dp=new int[amount+1];for(int i=0;i<=amount;i++) dp[i]=-2;dp[0]=0;a=coins;return dfs(amount);    }};

动态规划算法:

class Solution {public:int coinChange(vector<int>& coins, int amount) {if(amount==0)return 0;const int n=coins.size();int *dp=new int[amount+1];memset(dp,-1,sizeof(int)*(amount+1));dp[0]=0;for(int i=0;i<n;i++){const int w=coins[i];for(int i=amount;i>=0;i--) if(dp[i]!=-1){for(int j=1;i+j*w<=amount;j++){int k=i+j*w;if(dp[k]==-1||dp[k]>dp[i]+j) dp[k]=dp[i]+j;}}}return dp[amount];}};


0 0