原始完全揹包問題
說明:輸入輸出樣例
#二維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 表示...