题目
In the United Kingdom the currency is made up of pound (£) and pence (p). There are eight coins in general circulation:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), and £2 (200p). It is possible to make £2 in the following way:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p How many different ways can £2 be made using any number of coins?
解答
总量N的钱,有m种硬币,总的计数以C(N, m)表示。
那么:
- 如果解法中不包含第m种硬币, Sm,那么问题就变成C(N, m-1)。
- 如果解法中包含了第m种硬币,那么问题就变成了C(N-Sm, m)
所以把这两种情况考虑进来,问题就可以变成:
C(N, m) = C(N, m-1) + C(N-Sm, m)
这就是一个典型的递归了。那我们就要看递归退出的条件了。
- 如果N = 0,已经没钱剩下了,那就是得到解了,返回1.
- 如果N < 0,那就是没解了,返回0
- 如果N >= 1,但是m ⇐0,也就是都没有硬币了。那也是没解,返回0
Python
def count_coins(N, m):
if N < 0 or len(m) <= 0:
return 0
if N == 0:
return 1
return count_coins(N, m[:-1]) + count_coins(N-m[-1], m)
def solution31():
coins = [1,2,5,10,20,50,100,200]
return count_coins(200, coins)
R R版本是一样的:
count_coins <- function(N, m) {
n <- length(m)
if (N < 0 || length(m) <= 0)
return(0)
if (N == 0)
return(1)
return(count_coins(N, m[-n]) + count_coins(N-m[n], m)) } 答案
>>> solution31()
73682