You are given an integer array coins
representing coins of different denominations and an integer amount
representing a total amount of money.
Return the number of combinations that make up that amount. If that amount of money cannot be made up by any combination of the coins, return 0
.
You may assume that you have an infinite number of each kind of coin.
The answer is guaranteed to fit into a signed 32-bit integer.
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
Constraints:
1 <= coins.length <= 300
1 <= coins[i] <= 5000
- All the values of
coins
are unique. 0 <= amount <= 5000
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
/* | |
Framework DP | |
1. function | |
state vars: | |
- i: use to till i th coin | |
- a: amount money | |
dp[i][a]: use till i th coin, number of combinations of make a | |
2. relation | |
dp[i][a] = dp[i-1][a] + dp[i, a- coin[i]]; | |
3. base | |
dp[i][0] = 1 | |
(i < 0 or a < 0) 0 | |
*/ | |
public: | |
int n; | |
vector<vector<int>> memo; | |
vector<int> coins; | |
int dp(int i, int a){ | |
if(i < 0 or a < 0) return 0; | |
if(a == 0) return 1; | |
if(memo[i][a] == -1) | |
memo[i][a] = dp(i - 1, a) + dp(i, a - coins[i]); | |
return memo[i][a]; | |
} | |
int change(int amount, vector<int>& coins) { | |
n = coins.size(); | |
memo.resize(n, vector<int>(amount + 1, -1)); | |
this->coins = coins; | |
return dp(n - 1, amount); | |
} | |
}; |
No comments:
Post a Comment