Swift打印所有组合时的硬币找零

时间:2019-02-07 05:42:08

标签: swift

我想扩展我的代码,以找出给定硬币集可以达到目标数量的组合数量,以打印总和达到该数量的不同组合。

对于简单的找零问题,我有一个有效的备忘录解决方案,该解决方案提供了获取金额的方法,例如

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]]。

我知道这与打印备忘录表有关,但是我无法想象它应该如何工作,并且距离答案还很近。

0 个答案:

没有答案