簡體   English   中英

如何只計算一次硬幣變化組合?

[英]How to count the coin change combinations only once?

我有一個任務是制作一個 function ,它只接收一個 integer 和一個整數列表(不能添加任何其他內容)。 它應該從列表中返回總和為 k 的組合數,順序無關緊要(硬幣找零問題)。 另外,我需要使用遞歸。 這是我所做的:

def coin(k, lst):
    if k == 0:
        return 1
    if k < 0:
        return 0
    else:
        sum = 0
        for i in range(len(lst)):
            sum += coin(k - lst[i], lst)
        return sum

問題是它多次對相同的組合求和。 例如,

coin(5, [1, 2, 5, 6])

返回 9。

它應該返回 4(11111、122、1112、5)。

您的代碼實際上缺少必需的參數,而且您正在使用帶有遞歸的 for 循環,這弄亂了遞歸的本質。 嘗試使用此代碼:

def coin(k, lst, n):
    if(k == 0):
        return 1
    elif(n==0 or k<0):
        return 0
    else:
        return coin(k, lst, n-1) + coin(k-lst[n-1], lst, n)
arr = [1, 2, 5, 6]
n = len(arr)
print(coin(5, arr, n))

在 else 部分:第一個遞歸調用是留下當前數組元素並調用剩余的數組。 第二次遞歸調用是從所需的 change(k) 中減去當前數組元素,然后用當前元素再次調用,以便在以后的調用中再次選擇它。

此外,第一次和第二次調用之間的相加表明我們想要所有可能的組合,可以從第一次遞歸調用或第二次遞歸調用中派生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM