Leetcode 322 零錢兌換

2021-10-01 12:41:23 字數 1187 閱讀 2273

題目描述:

這是一道經典的動態規劃方法,我們可以構造乙個dp陣列,如果arr的長度為n,則dp陣列的行數為n,列數為aim+1,dp[i][j] 的含義是:在可以任意使用arr[0..i]貨幣的情況下,組成j所需要的最小張數。

明白以上定義後我們初始化第一行與第一列,第一行dp[0][0..aim]中每乙個元素dp[0][j]表示用arr[0]貨幣找開面額 j所需要的最少貨幣數,此時我們只能選取arr[0]這一張貨幣,所以只有arr[0]的整數倍的面額錢才可以找開,例如當arr[0]=3,aim=10時,只能找開3,6,9的貨幣,而其他面額的則無法找開,所以將arr[0][3,6,9]初始化為1,2,3 除此之外其他值初始化為整形int的最大值int_max表示無法找開。對於第一列dp[0..n][0] 中的每乙個元素dp[i][0]表示用arr[i]組成面額為0的錢的最少貨幣數,完全不需要任何貨幣,直接初始化為0即可。

對於剩下的任意dp[i][j],我們依次從左到右,從上到下計算,dp[i][j]的值可能來自下面:

以上所有情況中,最終取張數最小的,

即dp[i][j] = min( dp[i-1][j-karr[i]]+k )( k>=0 )

=>dp[i][j] = min } 接下來令x = y+1

=>dp[i][j] = min }

又有 min => dp[i][ j-arr[i] ] ,(這步是這麼來的:這個式子與上面的式子只相差了個1,說明這個式子少用了乙個arr[i]。表達過來就是使用前i個硬幣構成 j-arr[i]這個數。)

所以,最終有:dp[i][j] = min。

如果j-arr[i] < 0,即發生了越界,說明arr[i]太大了,用一張都會超過錢數j,此時dp[i][j] = dp[i-1][j]。

**:

class solution 

}for(int i = 1; i< len; i++)

dp[i][j] = math.min(dp[i-1][j],left);}}

return dp[len-1][amount] == integer.max_value?-1:dp[len-1][amount];}}

leetcode322 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11輸出 3解釋 11 5 5 1 示例 2 輸入 coins 2 amount 3...

leetcode 322 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...

LeetCode 322 零錢兌換

322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...