给你不同面值的硬币和总金额target。 写一个函数来计算组成这个数量的组合的数量。

来源:互联网 发布:磐石软件 编辑:程序博客网 时间:2024/05/14 04:59

本题源自leetcode

-------------------------------------------------

思路1:

动态规划: 用一个target+1 的数组dp 记录金额j可以有多少种硬币组合。

代码:

 int change(int amount, vector<int>& coins) {        if(amount==0)            return 1;        int len=coins.size();        if(len==0)            return 0;        vector<int> dp(amount+1,0);        dp[0]=1;        for(int i=0;i<len;i++){            for(int j=coins[i];j<=amount;j++){                dp[j] += dp[j-coins[i]];  //当前金额的组合数量            }        }        return dp[amount];    }

思路 2:

 int change(int amount, vector<int>& coins) {        if(amount==0)            return 1;        int len=coins.size();        if(len==0)            return 0;        unordered_map<string,int> mp;        sort(coins.begin(),coins.end());        return dfs(amount,coins,mp,len-1);    }    int dfs(int target,vector<int> &coins,unordered_map<string,int>& mp,int n){        if(target==0)            return 1;        if(target<0||n<0)            return 0;        string key=to_string(target)+"|"+to_string(n);        if(mp.find(key)==mp.end()){            int include=dfs(target-coins[n],coins,mp,n);  //包括这个硬币            int exclude=dfs(target,coins,mp,n-1);       //不包括这个硬币            mp[key]=include+exclude;         }        return mp[key];    }


原创粉丝点击