【问题标题】:Variation on coin-change硬币变化的变化
【发布时间】:2013-01-23 07:03:50
【问题描述】:

所以典型的硬币找零问题要求你弄清楚你是否可以使用无限面额的硬币 x1、x2、...、xn 来换取价值 v,但我想知道你会怎么做最多使用每个硬币一次解决相同的问题?

对于最初的问题,我知道您可以遍历值的前缀并查看是否可以为 v-x_i 进行更改,但是当它被限制为每个面额最多一个硬币时,我不知所措。

有什么提示可以帮助我入门吗?我可能在想你也可以迭代面额的前缀。不过不确定...

【问题讨论】:

    标签: dynamic-programming coin-change


    【解决方案1】:

    对于硬币找零问题,你可以使用前向或后向递归。在你的声明中,你使用了向后。这里我给出一个forward方法,它可以轻松解决UNLIMITED版本和AT-MOST-ONCE版本

    假设 f 是一维布尔数组。 f[i] 表示你是否可以对值 i 进行更改。最初,f[0]=true,其他为 false。

    无限版本:

    for (int i=1;i<=n;i++)
        for (int j=0;j<v;j++)
            if (f[j])
                f[j+x[i]]=true;
    

    最多一次版本:

    for (int i=1;i<=n;i++)
        for (int j=v-1;j>=0;j--)
            if (f[j])
                f[j+x[i]]=true;
    

    唯一的区别是循环 j 的顺序。

    一个帮助你理解的例子:

    假设只有一种硬币的价格为 2。即 x[1]=2。 v=10

    经过第一种算法,你可以得到f[0]=f[2]=f[4]=f[6]=f[8]=f[10]=true。

    但是对于第二种算法,你只能得到 f[0]=f[2]=true。

    【讨论】:

    • 如果有一个 3D 布尔数组怎么办?如何设置最多一次版本而时间不会成倍增长?
    【解决方案2】:

    这个问题可以用动态规划来解决。

    我个人觉得画一张表格来帮助推导算法很有用。下面是面额为 5、10、2、1 和总价值 V 的硬币的棕褐色示例表。

    首先,如果 v = 0,我们为所有 i 初始化表为 True(对于零值,更改总是正确的)

    For i: 0-&gt; n D(v,0) = true

    然后我们遍历表,逐行(从左到右)和逐列(从上到下)

    For v: 1-> V For i: 0-> n

    可以观察到,我们能够在两种情况下给出值 v 和硬币 xi 的变化:

    • 我们能够为价值 v - xi 和之前的硬币 x(i-1) 提供零钱

    D(v,i) = true if D(v-xi, i-1) = true

    这种情况的示例包括硬币 xi=5(第二列)和 v=5 或硬币 xi=1(最后一列)和 v=6

    • 我们能够为以前的硬币和相同的价值提供零钱。 (如果价值是 5 并且我们已经有一个硬币 5,那么我们之后有多少硬币并不重要 - 我们已经给了一个完整的零钱。)

    D(v,i) = true if D(v, i-1) = true

    这种情况的示例是第 5 行。

    在上述情况均不适用的情况下,我们无法提供全部更改,D(v,i) 为假。最终的解决方案是总值V和索引n对应的表格元素。

    总结一下:

      For i: 0-> n D(v,0) = true
    
      For v: 1-> V
        For i: 0-> n
    
        D(v,i)= D(v, i-1) V D(v-xi, i-1 )
        else D(v,i) = false;
    
      return D(V, n)
    

    repl 中完全编码解决方案的链接:https://repl.it/@majakudlicka/CoinChangeVariation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2016-01-24
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多