Python中贪婪方法的硬币兑换问题

Python中贪婪方法的硬币兑换问题,python,algorithm,greedy,Python,Algorithm,Greedy,我试图在硬币兑换问题中实现贪婪方法,但需要降低时间复杂度,因为编译器不会接受我的代码,而且由于我无法验证,我甚至不知道我的代码是否正确。函数应返回进行更改所需的注释总数。如果无法获得给定金额的更改,则返回-1。如果金额等于面额列表中可用的货币之一,则返回1 def make_change(denomination_list, amount): denomination_list.sort() n = len(denomination_list) i = n - 1

我试图在硬币兑换问题中实现贪婪方法,但需要降低时间复杂度,因为编译器不会接受我的代码,而且由于我无法验证,我甚至不知道我的代码是否正确。函数应返回进行更改所需的注释总数。如果无法获得给定金额的更改,则返回-1。如果金额等于面额列表中可用的货币之一,则返回1

def make_change(denomination_list, amount):

    denomination_list.sort()
    n = len(denomination_list)
    i = n - 1
    ans = 0
    x = 0
    while i>= 0 :
        while denomination_list[i]<= amount:
            ans = +1
            amount -= denomination_list[i]
            i -= 1
        if amount == 0:
            x = 1
        elif amount<0:
            x = -1
    return x

    amount= 20
    denomination_list = [1,15,10]
    print(make_change(denomination_list, amount))

如果可能的话,您希望最小化列表索引的使用,并迭代列表本身。下面是一个有效的代码:

# Pre-process denomination list before function, sorting in decreasing order
denomination_list = [1,15,10]
denomination_list.sort(reverse = True)
# Ensure ones are available for change (or infinite loop may result)
if denomination_list[-1] != 1:
    denomination_list.append(1)

def make_change(denomination_list, amount):
    change = []
    # Iterate through coins
    for coin in denomination_list:
        # Add current coin as long as not exceeding ampoiunt
        while amount:
            if coin <= amount:
                change.append(coin)
                amount -= coin
            else:
                break
    return change

amount= 43
print(make_change(denomination_list, amount))

这将适用于金额的非整数值,并将列出四舍五入金额的更改。

您希望尽可能减少列表索引的使用,并在列表本身上迭代。下面是一个有效的代码:

# Pre-process denomination list before function, sorting in decreasing order
denomination_list = [1,15,10]
denomination_list.sort(reverse = True)
# Ensure ones are available for change (or infinite loop may result)
if denomination_list[-1] != 1:
    denomination_list.append(1)

def make_change(denomination_list, amount):
    change = []
    # Iterate through coins
    for coin in denomination_list:
        # Add current coin as long as not exceeding ampoiunt
        while amount:
            if coin <= amount:
                change.append(coin)
                amount -= coin
            else:
                break
    return change

amount= 43
print(make_change(denomination_list, amount))

这将适用于金额的非整数值,并将列出四舍五入金额的更改。

Try-=而不是=-作为开始。@OneLyner-done。您的代码有许多小问题和两个主要的设计缺陷。第一个设计缺陷是代码一次只从数量中移除一枚硬币。如果数量较大,则会导致超时。例如,如果金额为1000000,最大的硬币为15,则循环必须执行66666次才能将金额减少到10。这可以用除法来解决。商是硬币的数量,剩余的是去掉这些硬币后剩下的。例如,1000000//15是66666,1000000%15是10。第二个设计缺陷是贪婪算法对于硬币兑换问题的某些实例不是最优的。代码中有一个例子。当数量为20且硬币为[15,10,1]时,贪婪算法将选择六枚硬币:15,1,1,1,1,当最佳答案为两枚硬币:10,10时。另一个例子是一笔7英镑的硬币[3,2]。贪婪算法将选择3,3,然后失败,而正确答案是3,2,2。@user3386109比您高。对于您的反馈,我会记住这一点。但是,问题中特别提到了使用贪婪方法,因为我是新手。首先尝试-=而不是=。@OneLyner done。您的代码有许多小问题,还有两个主要的设计缺陷。第一个设计缺陷是代码一次只从数量中移除一枚硬币。如果数量较大,则会导致超时。例如,如果金额为1000000,最大的硬币为15,则循环必须执行66666次才能将金额减少到10。这可以用除法来解决。商是硬币的数量,剩余的是去掉这些硬币后剩下的。例如,1000000//15是66666,1000000%15是10。第二个设计缺陷是贪婪算法对于硬币兑换问题的某些实例不是最优的。代码中有一个例子。当数量为20且硬币为[15,10,1]时,贪婪算法将选择六枚硬币:15,1,1,1,1,当最佳答案为两枚硬币:10,10时。另一个例子是一笔7英镑的硬币[3,2]。贪婪算法将选择3,3,然后失败,而正确答案是3,2,2。@user3386109比您高。对于您的反馈,我会记住这一点。但是,问题中特别提到了使用贪婪方法,因为我是新手。谢谢你的帮助,虽然它没有明确给出我想要的答案,但它确实帮助我更接近我想要的。谢谢你的帮助,虽然它没有明确给出我想要的答案,它确实帮助我更接近我想要的东西。