518. 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

Rust Solution

struct Solution;

impl Solution {
    fn change(amount: i32, coins: Vec<i32>) -> i32 {
        let amount = amount as usize;
        let n = amount + 1;
        let mut dp: Vec<i32> = vec![0; n];
        dp[0] = 1;
        for coin in coins {
            let mut sum = coin as usize;
            while sum <= amount {
                dp[sum] += dp[sum - coin as usize];
                sum += 1;
            }
        }
        dp[amount]
    }
}

#[test]
fn test() {
    let amount = 5;
    let coins = vec![1, 2, 5];
    let res = 4;
    assert_eq!(Solution::change(amount, coins), res);
    let amount = 3;
    let coins = vec![2];
    let res = 0;
    assert_eq!(Solution::change(amount, coins), res);
    let amount = 10;
    let coins = vec![10];
    let res = 1;
    assert_eq!(Solution::change(amount, coins), res);
}

Having problems with this solution? Click here to submit an issue on github.