我想扩展我的代码,以找出给定硬币集可以达到目标数量的组合数量,以打印总和达到该数量的不同组合。
对于简单的找零问题,我有一个有效的备忘录解决方案,该解决方案提供了获取金额的方法,例如
ways(n: 4, coins: [1,2,3])
提供4。
func ways(n: Int, coins: [Int]) -> Int {
var memo: [[Int]] = Array(repeating: Array(repeating: 0, count: coins.count), count: n)
return coinChange(n, coins, 0, 0, &memo)
}
// cache is a concatenation of amount - index
func coinChange(_ target: Int, _ coins: [Int], _ ptr: Int, _ current : Int, _ memo: inout [[Int]]) -> Int {
if (current == target) { return 1 }
if (ptr > coins.count - 1) {return 0}
if (current > target) {return 0}
var sum = 0
if (memo[current][ptr] != 0) {
return memo[current][ptr]
}
// add the current coin and don't move on
sum += coinChange(target, coins, ptr, current + coins[ptr], &memo )
// don't take the current coin, and therefore more on
sum += coinChange(target, coins, ptr + 1, current, &memo)
memo[current][ptr] = sum
return sum
}
我确实知道上述代码有不同的DP方法,但是这个问题是关于打印方式而不是上面的方法。
但是,我正在努力返回实现4的不同组合的方法。 要明确的是,这4种方式是[[1,1,1,1],[2,2],[1,1,2],] [1,3]]。
我知道这与打印备忘录表有关,但是我无法想象它应该如何工作,并且距离答案还很近。