我有无限的4种类型的硬币:[1,5,25,50]。 如何选择 EXACT 48个硬币进行1美元的改变?(以任何一种有效的方式)
我知道如何递归地解决这个问题,但是可以使用DP来解决它吗?怎么样?谢谢!
答案 0 :(得分:1)
让我们想制作n cents
,我们会获得每个S = { S1, S2, S3, .. Sm }
硬币的无限供应。
动态规划方法:
要计算解决方案的总数,我们可以将所有设置解决方案划分为两组
mth coin (or Sm)
的解决方案。 at least one Sm
。让count(S[], m, n)
成为计算解决方案数量的函数,然后它可以写成count(S[], m-1, n)
和count(S[], m, n-Sm)
的 sum 。
如此表述为
count(n,m) = count(n, m-1) + count(n- sm, m)
以下基本情况:
count(n,m) =1, n=0
,一个解决方案 - 我们没有钱,只有一种方法可以解决问题 - 选择不改变硬币,或者更准确地说,选择硬币更换0
count(n,m) =0, n<0
,没有解决方案 - 负金额
count(n,m) =1, n>=1, m<=0
,没有解决方案 - 我们有钱,但没有可用的更改
答案 1 :(得分:1)
可能的解决方案可能如下(Haskell):
change d coins | null coins = []
| d==0 = []
| d>=coin = coin:change (d-coin) coins
| otherwise = change d (tail coins) where
coin = head coins
请注意:
以下是一些结果:
*Main> change 100 [50, 25, 5, 1]
[50,50]
*Main> change 99 [50, 25, 5, 1]
[50,25,5,5,5,5,1,1,1,1]
*Main> change 75 [50, 25, 5, 1]
[50,25]
如果您对解决方案中使用的硬币数量有限制:
exactChange d coins n
| d==0 && n==0 = [[]]
| d>0 && n==0 = []
| d==0 && n>0 = []
| null coins = []
| d>=coin = useFirstCoinSolutions ++ skipFirstCoinSolutions
| otherwise = skipFirstCoinSolutions where
coin = head coins
rest = tail coins
useFirstCoinSolutions = map (\x->coin:x) $ exactChange (d-coin) coins (n-1)
skipFirstCoinSolutions = exactChange d rest n
这给出了以下结果:
*Main> exactChange 100 [50, 25, 5, 1] 48
[[25,25,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[25,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
因此,它提供了所有可能的解决方案,用精确的48个硬币改变100分
解释