零钱兑换——动态规划

71 阅读1分钟

image.png

代码:

状态转移 dp[i] = dp[i-coin] + 1

  1. 构建dp数组,自动初始化dp[0] = 0
  2. 第一层for遍历amount的同时初始化dp数组的其他值为-1,即默认无法组合,若第二层for无法更新dp数组,那么默认-1即可
  3. 第二层for遍历coins,因为要找出最小的dp[i]
  4. 找最小状态转移的同时,要保证是符合要求的状态转移,即i - coin < 0 || dp[i - coin] == -1这两种前置状态是不能被用作状态转移的
  5. 如果满足了状态转移条件,我们依旧要判断现在的状态状态转移过来的cur是否比我们现在的状态小,小则覆盖原来的值
  6. 当然因为我们给了dp数组初始值,所以如果dp[i] == -1 那么无需判断,直接覆盖原来的-1即可
  7. 因为-1是指没有找到答案的情况,找到答案后自然要将其覆盖
func coinChange(coins []int, amount int) int {
    //dp := make([]int,amount+1)
    dp := [1e4+1]int{}
    for i:=1; i<=amount; i++ {
        dp[i] = -1
        for _, coin := range coins {
            if i - coin < 0 || dp[i - coin] == -1 {
                continue
            }
            if cur := dp[i - coin] + 1; dp[i] == -1 || dp[i] > cur {
                dp[i] = cur
            }
        }
    }
    return dp[amount]
}