動態規劃 揹包問題

2021-09-26 04:26:31 字數 1839 閱讀 5835

揹包問題

有n種物品,每種物品重量和價值分別為w[i],v[i],若揹包重量限制為b,每種物品可放多個,求max value的物品放法

#coding=utf-8

'''設第i種物品放x[i]個,假設先取前k種物品,分配給前k種物品的重量為x,

f[k][x]為可得到的max value, i[k][x]為標記位

'''import numpy as np

defknapsack

(n,b,w,v)

: f = np.zeros(

(n,b+1)

) i = np.zeros(

(n,b+1)

)# initialize f,i when x==0

for i in

range

(n):

f[i][0

]=0 i[i][0

]=-1

for k in

range(0

,n):

for x in

range(1

,b+1):

if(x-w[k]

>=0)

and(k-

1>=0)

:if f[k-1]

[x]> f[k]

[x-w[k]

]+v[k]

: f[k]

[x]= f[k-1]

[x] i[k]

[x]= i[k-1]

[x]else

: f[k]

[x]= f[k]

[x-w[k]

]+ v[k]

i[k]

[x]= k

elif k-

1>=0:

f[k]

[x]= f[k-1]

[x] i[k]

[x]= i[k-1]

[x]elif x-w[k]

>=0:

f[k]

[x]= f[k]

[x-w[k]

]+ v[k]

i[k]

[x]= k

else

: f[k]

[x]=

0return f[n-1]

[b], i

deftrack_solution

(n,b,w,i)

: x = i[n-

1,b]

rest_b = b

ls_solution = np.zeros(n)

while

(rest_b>0)

: ls_solution[

int(x)]+=

1 rest_b = rest_b-w[

int(x)

] x = i[

int(x)

,int

(rest_b)

]return ls_solution

if __name__==

'__main__'

: v =[1

,3,5

,9] w =[2

,3,4

,7] b =

10 n =

4 f,i = knapsack(n,b,w,v)

ls = track_solution(n,b,w,i)

print

(f,ls)

動態規劃 揹包問題

給定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 元。於是,他把每...