硬币的种数

Sum of Coins

Posted by BY on November 3, 2020

前言

持续更新了

正文

问题来源

同学问我的一个问题。

题目

⼩明的抽屉⾥有n个游戏币,总⾯值m,游戏币的设置有1分的,2分的,5分的,10分的,⽽在⼩明所拥有的游戏币中有些⾯面值的游戏币可能没有,求⼀一共有多少种可能的游戏币组合⽅方式? 输⼊入:输⼊入两个数n(游戏币的个数),m(总⾯面值)。
输出:请输出可能的组合⽅方式数;

我先想用动归来做,但是错了

var coins []int = []int{1, 2, 5, 10}
func countCoins(n, m int) int {
	if n > m || m > 10*n {
		return 0
	}
	dp := make([]int, m+1)
	// init 
	for i := 0; i < len(coins) && coins[i] <= m; i++ {
		dp[coins[i]] = 1
	}
	for i := 1; i < n; i++ {
		for j := 0; j <= m; j++ {
			if dp[j] == 0 {
				continue
			}
			for k := 0; k < len(coins) && (j + coins[k] <= m); k++ {
				dp[j+coins[k]]++ 
			}
		}
	}
	return dp[m]
}

算重复了 比如3个硬币,总共7块钱。

不能重复算

var coins []int = []int{1, 2, 5, 10}
func countCoins(n, m int) int {
	res := 0
	dfs(0, n, m, &res)
	return res
}

func dfs(i, n, m int, res *int) {
	if n < 0 || m < 0 {
		return
	}
	if n == 0 && m == 0 {
		(*res)++
		return 
	}
	for j := i; j < len(coins); j++ {
		dfs(j, n-1, m-coins[j], res)
	}
}

总结:

勤思考。

结语

不管怎么样好好加油。