|  | @@ -0,0 +1,35 @@
 | 
	
		
			
				|  |  | +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
 | 
	
		
			
				|  |  | +}
 |