Python 動態規劃演算法

2022-09-11 13:42:20 字數 2263 閱讀 9569

假設你是乙個小偷,背乙個可裝4磅東西的揹包。可盜竊的商品有如下3件:

音響,4磅,價值3000美元

膝上型電腦,3磅,價值2000美元

吉他,1磅,價值1500美元

為了讓盜竊的商品價值最高,你該選擇哪些商品?

《演算法**》第9章動態規劃

w=[0,4,3,1].  #商品的重量列表,w[0]佔位用

p=[0,3000,2000,1500] #價值列表,p[0]無用

n=len(w)-1 #計算物體的個數

m=4 #揹包的最大載重量

optp=[[0 for col in range(m+1)] for raw in range(n+1)]

#optp 相當於建立了乙個n*m的全零矩陣,n行為物件,m列為子揹包載重量。

def solution(w,p,m):

n=len(w)-1

for i in range(1,n+1):

for j in range(1,m+1):

if j>=w[i]:

optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i]]

else:

optp[i][j]=optp[i-1][j]

#下面這段**是為了求出盜竊的商品價值最高時的商品組合x。

j=mx=

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

if optp[i][j]>optp[i-1][j]:

j=j-w[i]

return optp[n][m],x

網易筆試:一種cpu的兩個核能夠同時處理任務,現在有n個已知資料量的任務需要交給cpu處理,假設已知cpu的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入cpu進行處理,現在需要設計乙個方案讓cpu處理完這批任務所需時間最少,求這個最小時間。

輸入包括2行:

第一行為整數n(1<=n<=50)

第二行為n個整數lengthi單位時b,每個數均為1024的倍數。

輸出乙個整數,表示最少需要處理的時間。

問題實質是動態規劃問題,把陣列分成2部分,使得2部分的和相差最小。差值最小就是說2部分的和最接近,而且各部分的和與總和的一半也是最接近。假設用sum1表示第一部分的和,sum2表示第二部分的和,sum表示所有數的和,那麼sum1+sum2=sum。假設sum1= p[i]:

optp[i][j]=max(optp[i-1][j],p[i]+optp[i-1][j-w[i])

else:

optp[i][j]=optp[i-1][j]

return optp[-1][-1]最長上公升子串行

lis=[2,1,5,3,6,4,8,9,7]

d=[1]*len(lis)

res=1

for i in range(len(lis)):

for j in range(i):

if lis[j]<=lis[i] and d[i]res:

res=d[j]

return res

最長公共子串行

s1=[1,3,4,5,6,7,7,8]

s2=[3,5,7,4,8,6,7,8,2]

d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]

for i in range(1,len(s1)+1):

for j in range(1,len(s2)+1):

if s1[i-1]==s2[j-1]:

d[i][j]=d[i-1][j-1]+1

else:

d[i][j]=max(d[i-1][j],d[i][j-1])

return d[-1][-1]

s1=[1,3,4,5,6,7,7,8]

s2=[3,5,7,4,8,6,7,8,2]

d=[[0]*(len(s2)+1) for i in range(len(s1)+1)]

res=0

for i in range(1,len(s1)+1):

for j in range(1,len(s2)+1):

if s1[i-1]==s2[j-1]:

d[i][j]=d[i-1][j-1]+1

res=max(d[i][j],res)

else:

d[i][j]=0

return res

python 動態規劃演算法

你有三枚硬幣,面值分別是a 2,5,7 每種硬幣足夠多,買一本書需要x 27元,如何用最少的硬幣組合正好付清,不需要對方找錢。1.確定狀態 假設最優解為k a1 a2 ak 1.1 最後一步 假設最優解為 27 ak 1.2 子問題 求27 ak最優解f x f x 2 1 f x 5 1 f x ...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...