func coinChange(coins []int, amount int) int {
	dp := make([]int, amount+1)
	for i := 1; i <= amount; i++ { // dp[0] is 0
		dp[i] = amount + 1
	}
	for _, coin := range coins {
		for i := coin; i <= amount; i++ {
			dp[i] = minInt(dp[i], dp[i-coin]+1)
		}
	}
	if amount < dp[amount] {
		return -1
	}
	return dp[amount]
}

func minInt(x, y int) int {
	if x < y {
		return x
	}
	return y
}