From c33b849863d8eac306b6520f195c8e8a97aa4607 Mon Sep 17 00:00:00 2001 From: Hao Chen Date: Mon, 18 Mar 2019 17:22:55 +0800 Subject: [PATCH] New Problem Solution "Coin Change 2" --- README.md | 1 + algorithms/cpp/coinChange/CoinChange2.cpp | 84 +++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 algorithms/cpp/coinChange/CoinChange2.cpp diff --git a/README.md b/README.md index e368948..547671b 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ LeetCode |538|[Convert BST to Greater Tree](https://leetcode.com/problems/convert-bst-to-greater-tree/) | [Python](./algorithms/python/ConvertBSTtoGreaterTree/convertBST.py)|Easy| |532|[K-diff Pairs in an Array](https://leetcode.com/problems/k-diff-pairs-in-an-array/) | [Python](./algorithms/python/K-diffPairsInAnArray/findPairs.py)|Easy| |520|[Detect Capital](https://leetcode.com/problems/detect-capital/) | [C++](./algorithms/cpp/detectCapital/DetectCapital.cpp)|Easy| +|518|[Coin Change 2](https://leetcode.com/problems/coin-change-2/) | [C++](./algorithms/cpp/coinChange/CoinChange2.cpp)|Medium| |509|[Fibonacci Number](https://leetcode.com/problems/fibonacci-number/) | [Python](./algorithms/python/FibonacciNumber/fib.py)|Easy| |477|[Total Hamming Distance](https://leetcode.com/problems/total-hamming-distance/) | [C++](./algorithms/cpp/totalHammingDistance/totalHammingDistance.cpp)|Medium| |463|[Island Perimeter](https://leetcode.com/problems/island-perimeter/) | [C++](./algorithms/cpp/islandPerimeter/IslandPerimeter.cpp)|Easy| diff --git a/algorithms/cpp/coinChange/CoinChange2.cpp b/algorithms/cpp/coinChange/CoinChange2.cpp new file mode 100644 index 0000000..2bcb992 --- /dev/null +++ b/algorithms/cpp/coinChange/CoinChange2.cpp @@ -0,0 +1,84 @@ +// Source : https://leetcode.com/problems/coin-change-2/ +// Author : Hao Chen +// Date : 2019-03-18 + +/***************************************************************************************************** + * + * You are given coins of different denominations and a total amount of money. Write a function to + * compute the number of combinations that make up that amount. You may assume that you have infinite + * number of each kind of coin. + * + * Example 1: + * + * Input: amount = 5, coins = [1, 2, 5] + * Output: 4 + * Explanation: there are four ways to make up the amount: + * 5=5 + * 5=2+2+1 + * 5=2+1+1+1 + * 5=1+1+1+1+1 + * + * Example 2: + * + * Input: amount = 3, coins = [2] + * Output: 0 + * Explanation: the amount of 3 cannot be made up just with coins of 2. + * + * Example 3: + * + * Input: amount = 10, coins = [10] + * Output: 1 + * + * Note: + * + * You can assume that + * + * 0 <= amount <= 5000 + * 1 <= coin <= 5000 + * the number of coins is less than 500 + * the answer is guaranteed to fit into signed 32-bit integer + * + ******************************************************************************************************/ +class Solution { +public: + int change(int amount, vector& coins) { + return change_dp(amount, coins); + return change_recursive(amount, coins); // Time Limit Error + } + + + int change_recursive(int amount, vector& coins) { + int result = 0; + change_recursive_helper(amount, coins, 0, result); + return result; + } + + // the `idx` is used for remove the duplicated solutions. + void change_recursive_helper(int amount, vector& coins, int idx, int& result) { + if (amount == 0) { + result++; + return; + } + + for ( int i = idx; i < coins.size(); i++ ) { + if (amount < coins[i]) continue; + change_recursive_helper(amount - coins[i], coins, i, result); + } + return; + } + + int change_dp(int amount, vector& coins) { + vector dp(amount+1, 0); + dp[0] = 1; + for (int i=0; i= coins[i]) { + dp[n] += dp[n-coins[i]]; + } + } + } + + return dp[amount]; + } +}; +