LeetCode 518. Coin Change 2 Coin Change

原题链接在这里:https://leetcode.com/problems/coin-change-2/

题目:

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

题解:

Let dp[i][j] denote with first i - 1 iron, to make up j, how many ways there are.

dp[i][j] = dp[i-1][j] + dp[i][j - coins[i - 1]]. 

dp[i - 1][j], without using coins[i - 1], the ways to make up j.

Since we are using coins[i - 1], we need to accumlate the ways from amount j - coins[i - 1].

Time Complexity: O(amount * n). n = coins.length.

Space: O(amount).

AC Java:

 1 class Solution {
 2     public int change(int amount, int[] coins) {
 3         if(amount < 0 || coins == null){
 4             return 0;
 5         }
 6         
 7         int [] dp  = new int[amount + 1];
 8         dp[0] = 1;
 9         
10         for(int coin : coins){
11             for(int i = 1; i <= amount; i++){
12                 if(i - coin < 0){
13                     continue;
14                 }
15                 
16                 dp[i] += dp[i - coin];
17             }
18         }
19         
20         return dp[amount];
21     }
22 }

类似Coin Change.

猜你喜欢

转载自www.cnblogs.com/Dylan-Java-NYC/p/12194875.html