518.coin-change-2.go 696 B

1234567891011121314151617181920212223242526272829303132333435
  1. func change(amount int, coins []int) int {
  2. dp := make([]int, amount+1)
  3. dp[0] = 1
  4. for _, c := range coins { // dp[i+c] += dp[i]
  5. for i := 0; i <= amount-c; i++ {
  6. dp[i+c] += dp[i]
  7. }
  8. }
  9. return dp[amount]
  10. }
  11. type pair struct {
  12. _1 int
  13. _2 int
  14. }
  15. func changeDFS(amount int, coins []int) int { // Memory search
  16. m := make(map[pair]int)
  17. return dfs(amount, coins, 0, m)
  18. }
  19. func dfs(amount int, coins []int, i int, m map[pair]int) (sum int) {
  20. if amount == 0 {
  21. return 1
  22. } else if len(coins) == i {
  23. return 0
  24. } else if val, ok := m[pair{amount, i}]; ok {
  25. return val
  26. }
  27. for c := 0; c <= amount; c += coins[i] {
  28. sum += dfs(amount-c, coins, i+1, m)
  29. }
  30. m[pair{amount, i}] = sum
  31. return
  32. }