leetCode 322 零錢兌換

2021-10-10 19:24:37 字數 1779 閱讀 7674

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

你可以認為每種硬幣的數量是無限的。

示例 1:

輸入:coins =[1

,2,5

], amount =

11輸出:3

解釋:11=5

+5+1

此題相當於完全揹包問題,與01揹包問題的不同在於,完全揹包問題中的物品可以無限取,而01揹包問題每個問題只能取一次或者不取。通過零一揹包的狀態轉移方程可以推導出完全揹包的狀態轉移方程:

f (i

,j)=

max(

f(i−

1,j)

,f(i

,j−v

[i])

+w[i

])

f(i,j) = max(f(i-1,j), f(i, j - v[i]) +w[i])

f(i,j)

=max

(f(i

−1,j

),f(

i,j−

v[i]

)+w[

i])揹包問題需要注意題目問的是恰好放滿揹包還是,揹包可以不放滿,如果是恰好則初始化條件只能初始化f

(0...n,

0)為0

,f(0

,1...v)

為無解(

+inf

init

y或者−

infi

nity

根據題目

求最大還

是最小初

始化

)f(0...n,0)為0, f(0, 1...v)為無解(+infinity 或者-infinity根據題目求最大還是最小初始化)

f(0...

n,0)

為0,f

(0,1

...v

)為無解

(+in

fini

ty或者

−inf

init

y根據題

目求最大

還是最小

初始化)

;如果不要求揹包被剛好放滿則初始化條件為f

(0...n,

0)=0

,f(0

,1...v)

=0

f(0...n, 0) = 0,f(0, 1...v) = 0

f(0...

n,0)

=0,f

(0,1

...v

)=0

此題屬於揹包恰好放滿的情況,下面是二維dp的**

class

solution}}

return dp[n]

[amount]

== integer.max_value -1?

-1: dp[n]

[amount];}

}

可以對上面的二維dp進行空間優化改為1維dp,改進後可以發現完全揹包只需要將 0-1 揹包的逆序遍歷 dp 陣列改為正序遍歷即可。

class

solution

}return dp[amount]

== integer.max_value -1?

-1: dp[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...