返回实际使用的硬币列表的动态更改算法

emihir0

我正在尝试调整维基百科中的代码:

https://en.wikipedia.org/wiki/Change-making_problem#Implementation

还要输出使用的硬币列表,而不仅仅是使用的硬币数量。也就是说,例如:

change_making([6, 8, 12], 52)输出5正确(12+12+12+8+8 = 52)。

问题是我想以这种格式获得输出,[12, 12, 12, 8, 8]而不仅仅是5,我不知道该怎么做。

有问题的代码:

def _get_change_making_matrix(set_of_coins, r):
    m = [[0 for _ in range(r + 1)] for _ in range(len(set_of_coins) + 1)]

    for i in range(r + 1):
        m[0][i] = i

    return m


def change_making(coins, n):
    """This function assumes that all coins are available infinitely.

    n is the number that we need to obtain with the fewest number of coins.

    coins is a list or tuple with the available denominations."""

    m = _get_change_making_matrix(coins, n)

    for c in range(1, len(coins) + 1):

        for r in range(1, n + 1):

            # Just use the coin coins[c - 1].
            if coins[c - 1] == r:
                m[c][r] = 1

            # coins[c - 1] cannot be included.
            # We use the previous solution for making r,
            # excluding coins[c - 1].
            elif coins[c - 1] > r:
                m[c][r] = m[c - 1][r]

            # We can use coins[c - 1].
            # We need to decide which one of the following solutions is the best:
            # 1. Using the previous solution for making r (without using coins[c - 1]).
            # 2. Using the previous solution for making r - coins[c - 1] (without using coins[c - 1]) plus this 1 extra coin.
            else:
                m[c][r] = min(m[c - 1][r], 1 + m[c][r - coins[c - 1]])

    return m[-1][-1]

任何帮助/建议将不胜感激。

- - - - - - - 编辑 - - - - - - -

解决方案(删除评论):

def _change_making(coins, n):
    m = [[0 for _ in range(n + 1)] for _ in range(len(coins) + 1)]
    for i in range(n + 1):
        m[0][i] = i

    for c in range(1, len(coins) + 1):
        for r in range(1, n + 1):
            if coins[c - 1] == r:
                m[c][r] = 1
            elif coins[c - 1] > r:
                m[c][r] = m[c - 1][r]
            else:
                m[c][r] = min(m[c - 1][r], 1 + m[c][r - coins[c - 1]])

    i = len(coins)
    j = n
    ret = {k: 0 for k in coins}
    while j != 0:
        if m[i][j - coins[i - 1]] == m[i][j] - 1:
            ret[coins[i - 1]] += 1
            j = j - coins[i - 1]
        else:
            i = i - 1

    return ret

要找到最接近的* 解决方案:

def change_making(coins, n):
    try:
        return _generate_packing(coins, n)
    except:
        return generate_packing(coins, n + 1)

例如 change_making([2, 5], 8)

{2: 2, 5: 1}

因为 9 是最接近的可能解决方案。

  • 最接近我的意思是一个解决方案,是能够满足,但高于原始请求。例如,如果我们需要返还 8 英镑的零钱而我们没有确切的零钱,那么我们将返还 9 英镑,因为我们确实有零钱。
怪物

以下是如何做到这一点的步骤 -

1)启动与i=len(coins)j=n您的阵列(或列表的末尾,即)m

2) 现在我们知道coins(i-1)如果m[i][j]使用的硬币正好比 多一个硬币,则选择了有价硬币m[i][j-coins[i-1]]

3)如果没有发生这种情况,我们检查其他硬币(列表中较低索引的硬币)是否处于相同的状态。

例子-

一开始我们的值为 52,我们已经解决了使用您的函数需要 5 个硬币的问题。

仅当价值 40(即 52 -12)我们需要 4 个硬币时,我们才使用 12 个硬币中的第一个硬币,同样对于第二个和第三个 12 个价值的硬币。

但是我们不能使用第四个 12 硬币,因为使用 1 个硬币无法实现价值 4(即 16-12)

这是执行相同操作的代码片段(您可以在函数末尾使用它而不是 return 语句)-

i=len(coins)
j = n
while(j!=0):
    if m[i][j-coins[i-1]] == m[i][j]-1:
        print(coins[i-1])
        j=j-coins[i-1]
    else:
        i=i-1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaScript硬币更改/更改算法

来自分类Dev

python实际使用哪种GC算法?

来自分类Dev

实际使用展开的跳过列表

来自分类Dev

Scala代码更改算法

来自分类Dev

javascript制作更改算法

来自分类Dev

foldl的实际使用

来自分类Dev

动态编程硬币更改问题-使用Java的打印硬币

来自分类Dev

如何计算函数调用实际使用的返回值?

来自分类Dev

Minimax缓存更改算法的结果?

来自分类Dev

Haskell:如何更改算法以在任何大小的列表上工作?

来自分类Dev

Swift NSLocalizedString实际使用

来自分类Dev

算法硬币更改代码错误

来自分类Dev

您建议实际使用哪种算法为每个网站生成唯一的密码?

来自分类Dev

动态编程硬币更改问题

来自分类Dev

Dart如何实际使用websocket pingInterval?

来自分类Dev

PHP实际使用多少内存?

来自分类Dev

在领域中实际使用@Ignore吗?

来自分类Dev

Jade模板和angularjs的实际使用

来自分类Dev

Django:确定实际使用的pip包

来自分类Dev

4D +阵列的实际使用

来自分类Dev

实际使用域是否安全?

来自分类Dev

确定数组实际使用的大小

来自分类Dev

实际使用TCP_DEFER_ACCEPT?

来自分类Dev

Hadoop在项目中的实际使用

来自分类Dev

检查实际使用的glibc版本

来自分类Dev

如何实际使用 AddressSanitizer 和 MemorySanitizer?

来自分类Dev

使用Excel C-API函数xlfGetDocument询问“最后使用的行/列”,返回的值超出“实际使用范围”

来自分类Dev

硬币更换,动态编程,但首次使用后硬币价值降低

来自分类Dev

硬币更换,动态编程,但首次使用后硬币价值降低