diff --git a/322/step1.cpp b/322/step1.cpp new file mode 100644 index 0000000..a1c052e --- /dev/null +++ b/322/step1.cpp @@ -0,0 +1,29 @@ +/* + +Time Comprexity: O(n * m) (n: amount, m: coinsの長さ) +Space Complexity: O(n) + +intでオーバーフローしてしまい、脊髄反射的にlongを使用したがDPの方向を変えればオーバーフローしなさそう +*/ +class Solution { +public: + int coinChange(vector& coins, int amount) { + vector coin_nums(amount + 1, numeric_limits::max()); + coin_nums[0] = 0; + for (long i = 0; i <= amount; ++i) { + if (coin_nums[i] == numeric_limits::max()) { + continue; + } + for (const long coin : coins) { + if (i + coin > amount) { + continue; + } + coin_nums[i + coin] = min(coin_nums[i] + 1, coin_nums[i + coin]); + } + } + if (coin_nums.back() == numeric_limits::max()) { + return -1; + } + return coin_nums.back(); + } +}; diff --git a/322/step2.cpp b/322/step2.cpp new file mode 100644 index 0000000..1410d5e --- /dev/null +++ b/322/step2.cpp @@ -0,0 +1,27 @@ +/* +DPの方向を変えてオーバーフローしないようにした。 +*/ + +class Solution { +public: + int coinChange(vector& coins, int amount) { + vector coin_nums(amount + 1, numeric_limits::max()); + coin_nums[0] = 0; + for (int to_coins = 1; to_coins <= amount; ++to_coins) { + for (const int coin : coins) { + int from_coins = to_coins - coin; + if (from_coins < 0) { + continue; + } + if (coin_nums[from_coins] == numeric_limits::max()) { + continue; + } + coin_nums[to_coins] = min(coin_nums[from_coins] + 1, coin_nums[to_coins]); + } + } + if (coin_nums.back() == numeric_limits::max()) { + return -1; + } + return coin_nums.back(); + } +}; diff --git a/322/step3.cpp b/322/step3.cpp new file mode 100644 index 0000000..e50b8b7 --- /dev/null +++ b/322/step3.cpp @@ -0,0 +1,23 @@ +class Solution { +public: + int coinChange(vector& coins, int amount) { + vector min_coins(amount + 1, numeric_limits::max()); + min_coins[0] = 0; + for (int to_price = 1; to_price <= amount; ++to_price) { + for (const int coin : coins) { + int from_price = to_price - coin; + if (from_price < 0) { + continue; + } + if (min_coins[from_price] == numeric_limits::max()) { + continue; + } + min_coins[to_price] = min(min_coins[from_price] + 1, min_coins[to_price]); + } + } + if (min_coins.back() == numeric_limits::max()) { + return -1; + } + return min_coins.back(); + } +};