動態規劃 揹包問題

2021-10-13 15:45:51 字數 2239 閱讀 8185

乙個揹包最大容量為target, 有一些物品重量分別是2,2,4,6,3,利用動態規劃得出揹包中可以裝下的最大重量。

首先建立乙個二維矩陣作為動態規劃的狀態轉移矩陣。每乙個**代表放每個重量的物品,每一列代表揹包當前的重量。01

2345

6789

2101

0000

0002

1010

1000

0041

0101

0101

0610

1010

1010

3101

0111

11揹包中放入該物品則狀態轉移矩陣對應重量置為1.

def bag(items_info, capacity):

n = len(items_info)

memo = [[-1] * (capacity + 1) for i in range(n)]

memo[0][0] = 1

if items_info[0] <= capacity:

memo[0][items_info[0]] = 1

for i in range(n):

for cur_weight in range(1, capacity+1):

if memo[i-1][cur_weight] != -1:

memo[i][cur_weight] = 1

if cur_weight + items_info[i] <= capacity:

memo[i][cur_weight+items_info[i]] = 1

for w in range(capacity, -1, -1):

if memo[-1][w] != -1:

return w

def bag(weights, target):

m, n = len(weights), target + 1

table = [[0] * n for _ in range(m)]

# 處理第一行

table[0][0] = 1

if target >= weights[0]:

table[0][weights[0]] = 1

for i in range(1, m):

for j in range(n):

cur_weight = weights[i]

if table[i-1][j] != 0:

table[i][j] = table[i-1][j]

if j + cur_weight <= target:

table[i][j + cur_weight] = 1

print(table)

for i in range(n-1, 0, -1):

if table[-1][i] == 1:

return i

bag([2,2,4,6,3], 9)

在原有基礎上增加每個物品的重量:

def ba**alue(items, target):

m, n = len(items), target + 1

table = [[0] * n for _ in range(m)]

table[0][0] = 0

if items[0][0] <= target:

table[0][items[0][0]] = items[0][1]

for i in range(1, m):

for cur in range(target):

if table[i-1][cur] != 0:

table[i][cur] = table[i-1][cur]

if cur + items[i][0] <= target:

table[i][cur + items[i][0]] = max(table[i-1][cur + items[i][0]], table[i][cur] + items[i][1])

print(table)

for i in range(n-1, 0, -1):

if table[-1][i] != 0:

return table[-1][i]

items_info = [(3,5), (2,2), (1,4), (1,2), (4,10)]

capacity = 8

print(ba**alue(items_info, capacity))

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...