func change(amount int, coins []int) int {
	dp := make([]int, amount+1)
	dp[0] = 1
	for _, c := range coins { // dp[i+c] += dp[i]
		for i := 0; i <= amount-c; i++ {
			dp[i+c] += dp[i]
		}
	}
	return dp[amount]
}

type pair struct {
	_1 int
	_2 int
}

func changeDFS(amount int, coins []int) int { // Memory search
	m := make(map[pair]int)
	return dfs(amount, coins, 0, m)
}

func dfs(amount int, coins []int, i int, m map[pair]int) (sum int) {
	if amount == 0 {
		return 1
	} else if len(coins) == i {
		return 0
	} else if val, ok := m[pair{amount, i}]; ok {
		return val
	}
	for c := 0; c <= amount; c += coins[i] {
		sum += dfs(amount-c, coins, i+1, m)
	}
	m[pair{amount, i}] = sum
	return
}