From f42f9915af2910baa99ff6759363446bfb583890 Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Tue, 26 Nov 2019 20:49:17 +0800 Subject: [PATCH] add solution2 --- solutions/322. Coin Change.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/solutions/322. Coin Change.md b/solutions/322. Coin Change.md index 3da7605..703a591 100644 --- a/solutions/322. Coin Change.md +++ b/solutions/322. Coin Change.md @@ -15,7 +15,8 @@ 这个剪枝很关键,少了这个剪枝就会超时,加上这个剪枝直接击败99%。若不满足这个剪枝条件,那么递归下去就是。 ## 思路二 -熟悉动态规划的童鞋一眼就可以看出这其实就是个背包问题,先挖个坑,改天对背包问题做个总结。 +熟悉动态规划的童鞋一眼就可以看出这其实就是个背包问题,具体来说是一个恰好装满的完全背包问题, +我在我的博客文章[动态规划之背包问题系列](https://tangshusen.me/2019/11/24/knapsack-problem/)中对常见的几类背包问题做了个总结,此题的分析见5.2节,这里只给出代码。 @@ -47,4 +48,23 @@ public: ``` ## 思路二 -TODO +``` C++ +class Solution { +public: + int coinChange(vector& coins, int amount) { + vectordp(amount + 1, INT_MAX); + dp[0] = 0; + + for(int i = 1; i <= coins.size(); i++) + for(int j = coins[i-1]; j <= amount; j++){ + // 下行代码会在 1+INT_MAX 时溢出 + // dp[j] = min(dp[j], 1 + dp[j - coins[i-1]]); + if(dp[j] - 1 > dp[j - coins[i-1]]) + dp[j] = 1 + dp[j - coins[i-1]]; + } + + return dp[amount] == INT_MAX ? -1 : dp[amount]; + + } +}; +```