diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 5ff7cf8..34c570b 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -82,4 +82,5 @@ mod p1793_maximum_score_of_a_good_subarray; mod p1969_minimum_non_zero_product_of_the_array_elements; mod p2671_frequency_tracker; mod p2617_minimum_number_of_visited_cells_in_a_grid; -mod p2549_count_distinct_numbers_on_board; \ No newline at end of file +mod p2549_count_distinct_numbers_on_board; +mod p322_coin_change; \ No newline at end of file diff --git a/src/problem/p322_coin_change.rs b/src/problem/p322_coin_change.rs new file mode 100644 index 0000000..77b99de --- /dev/null +++ b/src/problem/p322_coin_change.rs @@ -0,0 +1,44 @@ +/** + * [322] Coin Change + */ +pub struct Solution {} + + +// submission codes start here + +impl Solution { + pub fn coin_change(coins: Vec, amount: i32) -> i32 { + let amount = amount as usize; + let mut dp = vec![i32::MAX; amount + 1]; + dp[0] = 0; + + for i in 1..=amount { + for coin in &coins { + let coin = *coin as usize; + if coin <= i && dp[i - coin] != i32::MAX { + dp[i] = dp[i].min(dp[i - coin] + 1); + } + } + } + + return if dp[amount] == i32::MAX { + -1 + } else { + dp[amount] + }; + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_322() { + assert_eq!(3, Solution::coin_change(vec![1,2,5], 11)); + assert_eq!(-1, Solution::coin_change(vec![2], 3)); + assert_eq!(0, Solution::coin_change(vec![1], 0)); + } +}