乙個揹包最大容量為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 元。於是,他把每...