当前位置: 首页 > 知识库问答 >
问题:

分而治之-最小变化-以数组形式返回硬币

乌和畅
2023-03-14

下面是最小硬币兑换问题的强力解决方案。它需要一个整数A(这是需要进行的更改)和一组硬币面额。它返回一个对象results,该对象具有基于硬币面额数组和硬币数组可以返回的最小硬币数。

例如,如果要求以[1,2,5]的值为10美分提供零钱,则它应返回2分钟硬币和两个一角硬币的数组[0,0,2]

它返回正确的最小值,但不是正确的硬币数组。

# values the algorithms should return, the min num of coins, the actual    
# coins in an array, and the original 

# array of coin denominations
class Results:

    a = 0
    change = []
    coinsDenom = []

# A is an array of coin denominations
# C is the change to be made
# returns results object
def changeslow(A, C):
    res = Results()
    res.coinsDenom = C
    res.change = []
    # initialize your change array to be the length of the coindenom array
    for i in range(0, len(res.coinsDenom)):
        res.change.append(0)

    minCoins = A

    for i in [j for j in C if j <= A]:
        if j == A:
            res.a = 1
            res.change[i] = res.change[i] + 1
            return res

        nextcall = changeslow(A-i, C)
        numCoins = 1 + nextcall.a

        if numCoins < minCoins:
            minCoins = numCoins
            res.change = nextcall.change
            res.change[0] = res.change[0] + 1



    res.a = minCoins

    return res

共有1个答案

时才俊
2023-03-14

这个问题最好通过使用动态规划来解决。例如,请参阅此http://www.columbia.edu/~cs2035/courses/csor4231。F07/动态。以下直观动态规划公式的pdf格式:

# DP-CHANGE
# find number of coins needed to represent a value and memoize the last coin
def DP_CHANGE(denoms, value):
    num_coins = [0]*(value+1) # store number of coins needed to represent coin values from [0..value]
    last_coin = [float('Inf')]*(value+1) # memoize last coin used to represent coin values from [0..value]
    for d in denoms:
        num_coins[d] = 1
    for i in range(1, value + 1):
        num_denom = min([(num_coins[i-d] + 1, d) for d in denoms if i - d >= 0])
        num_coins[i], last_coin[i] = num_denom[0], num_denom[1]
    return num_coins, last_coin

# TRACE-CHANGE
# back-trace the denominations used
def TRACE_CHANGE(value, last_coin):
    denoms_used = []
    while value > 0:
        denoms_used.append(last_coin[value]);
        value-=last_coin[value]
    return denoms_used

def FIND_CHANGE(value, denoms):
    num_coins, last_coin = DP_CHANGE(denoms, value)
    print 'number of coins needed to represent values ' + str(range(value+1)) + ': ' + str(num_coins)
    print 'minimum number of coins need to represent the value ' + str(value) + ': ' + str(num_coins[value])
    print 'coins of denominations needed:' + str(TRACE_CHANGE(value, last_coin))

FIND_CHANGE(10, [1,2,5])
# number of coins needed to represent values [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
#                                            [0, 1, 1, 2, 2, 1, 2, 2, 3, 3, 2]
# minimum number of coins need to represent the value 10: 2
# coins of denominations needed:[5, 5]

 类似资料:
  • 下面是最小硬币变化问题的蛮力解决方案。它需要一个int更改,也就是需要进行的更改,以及一系列硬币面值。它返回进行更改所需的最低硬币。 我如何修改它以同时返回一组硬币? 例如,如果要求给出值为[1,2,5]的10美分的零钱,它应该返回2个硬币分钟和一个数组[0,0,2]的2个硬币。

  • 我最近正在学习分而治之算法。 如果返回值假定为某个整数,我就能够解决这些问题。 例如:1。二进制搜索,这里我只需要返回1如果找到,否则-1。 例:2。数组中的最大数,只需返回一个数字。 但是当涉及到返回一个数组时,就像我们需要整个数组作为输出(Ex:排序)。 我觉得很难。 有人能帮你找到最好的方法吗? 下面是我的二进制搜索方法。

  • 问题内容: java中有什么方法可以返回新数组而不先将其分配给变量?这是一个例子: 我想做这样的事情,但是不起作用: 问题答案: 即使不将其分配给变量,您仍然需要创建该数组。试试这个: 您的代码示例无效,因为编译器一方面仍然需要知道要通过静态初始化创建的类型。

  • 对于使用分治方法的最大和子数组算法,我需要返回和和子数组。 我能在所有的测试中正确地计算和。然而,我无法计算出正确的子数组。 我的总数(正确):34 阵列:2 9 8 6 5-11 9-11 7 5-1-8-3 7-2 正确子数组:2 9 8 6 5 我的总数(正确):50 阵列:31-41 59 26-53 58 97-93-23 84 正确子数组:59 26-53 58 97 我的总数(正确)

  • 给定一组硬币面额和一个,找出所有可能的组合,使硬币总数达到最小。在我的解决方案中,我在中记录了总计为的最小硬币数。我不确定这将如何修改以存储总计为的实际硬币,并确保在这种情况下包括这两种可能性。我看过其他关于堆栈溢出的代码,但我只找到可以打印任何一个最佳解决方案的代码。 输入:最小硬币(10,[2,3,5,6,7,8]) 输出:[[5,5],[2,8]]

  • 问题内容: 我有以下收藏 我要收集所有其 在主阵列 我已经试过了 但这给了我这样的输出 我想要这样的输出 问题答案: 你可以。与mongoose一起使用,因为它返回一个数组,与使用相比,简单使用更好 或使用核心驱动程序中的基础: 如果您不希望获得“与众不同”的结果,则与之大致相同: 或与 您还可以使用,基本上可以改变聚合过程和“幕后”(“仅返回字段部分”,而不是独特的聚合方法): MongoDB本