動態規劃求解01揹包問題,最長遞增子串行

2021-08-14 20:07:05 字數 2524 閱讀 7753

01揹包問題:給定n中物品和乙個揹包,物品i的重量是wi,其價值位vi,揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?每件物品可以選擇裝或者不裝。

i代表前i個物品(包括i),j表示揹包重量,f(i, j)表示從前i個物品中選取到總重量不超過j的最大價值。

如果wi > j: f(i, j) = f(i-1, j) 否則f(i, j) = max(f(i-1, j), f(i-1, j-wi) +vi)。

假設山洞裡共有a,b,c,d ,e這5件寶物(不是5種寶物),它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包, 怎麼裝揹包,可以才能帶走最多的財富。

def package_max_value(weight, value, package_volume):

if len(weight) <= 0 or len(value) <= 0 or len(weight) != len(value):

return

res = [[0 for i in range(package_volume)] for i in range(len(value))]

for j in range(package_volume):

if j < weight[0]:

res[0][j] = 0

else:

res[0][j] = value[0]

for i in range(1, len(value)):

for j in range(package_volume):

if j < weight[i]:

res[i][j] = res[i-1][j]

else:

res[i][j] = max(res[i-1][j], res[i-1][j-weight[i]] + value[i])

return res

weight = [2,2,6,5,4]

value = [6,3,5,4,6]

package_volume = 10

print(package_max_value(weight, value, package_volume))

執行結果如下。

其中遇到二維陣列賦值問題,res = [[0]* package_volume]*len(value),其中package_volume = 10, len(value)  = 5,生成二維陣列後賦值操作,譬如res[1][2] = 20,結果每行的第三個元素變為20。原來是python中[array]*num中是建立了num個指向[array]的引用,一旦[array]改變,每行都改變。

正確建立二維陣列的方式是[[0 for i in range(row)] for j in range(column)]

備註:一維陣列通過[0]*5建立,是確實建立了5個元素,改變其中乙個不影響其他元素。這麼看來,*的操作是單個元素進行申請內容,而對list元素只做引用,只能deepcopy才可以真正複製list中的list元素。

最長遞增子串行:最長遞增子串行(longest increasing subsequence)是指找到乙個給定序列的最長子序列的長度,使得子串行中的所有元素單調遞增。

例如:[3,5,7,1,2,8,4]的lis是[3,5,7,8],長度為 4。

def longest_ascending_sub(src):

if len(src) <= 1:

return src

res = [1 for i in range(len(src))]

subsequence = [[ele] for ele in src]

for i in range(len(src)):

for j in range(i):

if src[i] >= src[j] and res[j] + 1 > res[i]:

res[i] = res[j] + 1

subsequence[i] = subsequence[j] + [src[i]]

return res, subsequence

src = [3,5,7,1,2,8,4]

a, b = longest_ascending_sub(src)

print('---每個位置最長遞增序列的長度----')

print(a)

print('---每個位置最長遞增序列的元素----')

print(b)

print('---最長資料為---\n%s'%len(b[a.index(max(a))]))

執行結果如下。

01揹包問題 動態規劃求解

時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 17 給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,問如何選擇裝入揹包的物品,使得裝入揹包的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只能有兩種選擇,裝入或者不裝入,不能裝入多次,也不能部分裝入。第一行輸入物品...

0 1揹包問題,動態規劃求解

1.什麼是0 1揹包問題?有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?舉例int v 每個物品對應的價值 int w 每個物品對應的重量 int bag 10 揹包最大承重10 0 1揹包問題 public static void main st...

用動態規劃求解0 1揹包問題

0 1揹包問題描述 有n件物品和乙個重量為m的揹包。每種物品均只有一件 第i件物品的重量是w i 價值是p i 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...