代码:
状态转移
dp[i] = dp[i-coin] + 1
- 构建dp数组,自动初始化
dp[0] = 0 - 第一层for遍历amount的同时初始化dp数组的其他值为-1,即默认无法组合,若第二层for无法更新dp数组,那么默认-1即可
- 第二层for遍历coins,因为要找出最小的
dp[i] - 找最小状态转移的同时,要保证是符合要求的状态转移,即
i - coin < 0 || dp[i - coin] == -1这两种前置状态是不能被用作状态转移的 - 如果满足了状态转移条件,我们依旧要判断现在的状态状态转移过来的cur是否比我们现在的状态小,小则覆盖原来的值
- 当然因为我们给了dp数组初始值,所以如果
dp[i] == -1那么无需判断,直接覆盖原来的-1即可 - 因为-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]
}