Leetcode完全 無限揹包小結(Python)

2021-10-09 04:14:27 字數 4224 閱讀 8729

原始完全揹包問題

說明:輸入輸出樣例

#二維dp

n, v =

map(

int,

input()

.split())

dp =[[

0for i in

range

(v+1)]

for j in

range

(n+1)]

for i in

range(1

, n+1)

: vi, wi =

map(

int,

input()

.split())

for j in

range(1

, v+1)

: dp[i]

[j]= dp[i-1]

[j]if j >= vi:

dp[i]

[j]=

max(dp[i-1]

[j], dp[i]

[j-vi]

+wi)

print

(dp[n]

[v])

#一維dp

n, v =

map(

int,

input()

.split())

dp =[0

for i in

range

(v+1)]

for i in

range(1

, n+1)

: vi, wi =

map(

int,

input()

.split())

for j in

range(1

, v+1)

:if j >= vi:

dp[j]

=max

(dp[j]

, dp[j-vi]

+wi)

print

(dp[v]

)

零錢兌換

題目位址

#二維dp

class

solution

:def

coinchange

(self, coins: list[

int]

, amount:

int)

->

int:

#狀態表示:dp[i][j]表示包括前i個硬幣組合成的金額j所需的最少硬幣個數

#狀態轉移方程:dp[i][j] = min(dp[i-1][j], min(dp[i][j]+1))

#初始化:dp[0][0]和dp[0][coins[0]]都為inf

#輸出dp[amount]

ifnot coins and amount <=0:

return-1

n =len(coins)

dp =

[[amount+

1for i in

range

(amount+1)

]for j in

range

(n+1)]

#初始化

dp[0]

[0]=

0for i in

range

(len

(dp)):

dp[i][0

]=0for i in

range(1

, n+1)

:for j in

range(1

, amount+1)

: dp[i]

[j]= dp[i-1]

[j]if j >= coins[i-1]

: dp[i]

[j]=

min(dp[i-1]

[j], dp[i]

[j-coins[i-1]

]+1)

return dp[-1

][-1

]if dp[-1

][-1

]!=amount+

1else-1

#一維dp

class

solution

:def

coinchange

(self, coins: list[

int]

, amount:

int)

->

int:

#狀態表示:dp[i]表示湊出金額i所需的最少硬幣個數

#狀態轉移方程:dp[i] = min(dp[i], dp[i-coin]+1)

#初始化:dp[0]為inf

#輸出dp[amount]

ifnot coins and amount <=0:

return-1

n =len(coins)

dp =

[amount+

1for i in

range

(amount+1)

]#初始化

dp[0]

=0for i in

range(1

, n+1)

:for j in

range

(coins[i-1]

, amount+1)

: dp[j]

=min

(dp[j]

, dp[j-coins[i-1]

]+1)

return dp[-1

]if dp[-1

]!=amount+

1else

-1

class

solution

:def

change

(self, amount:

int, coins: list[

int])-

>

int:

n =len(coins)

dp =[[

0for i in

range

(amount+1)

]for j in

range

(n+1)]

dp[0]

[0]=

1for i in

range

(len

(dp)):

dp[i][0

]=1for i in

range(1

, n+1)

:for j in

range(1

, amount+1)

: dp[i]

[j]= dp[i-1]

[j]if j >= coins[i-1]

: dp[i]

[j]= dp[i-1]

[j]+

(dp[i]

[j-coins[i-1]

])return dp[-1

][-1

]

組合數

題目位址

#只能用一維dp,因為每個揹包容量裝的是當前狀態下的所有可能

#狀態表示:dp[i],目標數為i的組合數個數

#狀態轉移:dp[i] = sum(dp[i-num])

#basecase:dp[0] = 1,表示如果那個硬幣的面值剛剛好等於需要湊出的價值,這個就成為 1 種組合方案

class

solution

:def

combinationsum4

(self, nums: list[

int]

, target:

int)

->

int:

n =len(nums)

dp =[0

]*(target+1)

dp[0]

=1for i in

range(1

, target+1)

:for j in

range

(n):

if i >= nums[j]

: dp[i]

+= dp[i-nums[j]

]return dp[-1

]

1013 無限揹包

你現在有乙個體積為v的大袋子,有n種物品,假設每種物品的數量有無限多個,而且第i種物品的體積是c i 價值是w i 請選擇一些物品放入袋中,使袋中物品的價值總和最大。注意每種物品的數量是無限多的 對於放入袋中的同種物品數量沒有限制。第一行包含兩個正整數v和n,分別代表袋子的體積和物品的種類數。以下n...

1013 無限揹包

你現在有乙個體積為v的大袋子,有n種物品,假設每種物品的數量有無限多個,而且第i種物品的體積是c i 價值是w i 請選擇一些物品放入袋中,使袋中物品的價值總和最大。注意每種物品的數量是無限多的 對於放入袋中的同種物品數量沒有限制。第一行包含兩個正整數v和n,分別代表袋子的體積和物品的種類數。以下n...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...