def lcs(A, B):
m = len(A)
n = len(B)
L = [[0] * (n+1) for i in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if A[i-1] == B[j-1]:
L[i][j] = L[i-1][j-1] + 1
else:
L[i][j] = max(L[i-1][j], L[i][j-1])
s = ''
while L[i][j] > 0:
if L[i][j] == L[i-1][j]:
i -= 1
elif L[i][j] == L[i][j-1]:
j -= 1
else:
s = A[i-1] + s
i -= 1
j -= 1
return s
2.0-1背包问题
0-1背包问题 + 返回背包物品
def bagValue(C, n, W, V):
# 计算放入包中的物品的最大价值
bv = [[0 for j in range(C+1)] for i in range(n+1)]
for i in range(1, n+1): # i是物品编号,从1开始
for j in range(1, C+1): # j是背包容量,从1开始
if W[i-1] <= j: # 如果当前物品所需空间小于等于j
bv[i][j] = max(bv[i-1][j], bv[i-1][j-W[i-1]] + V[i-1])
else:
bv[i][j] = bv[i-1][j]
# 价值最大时,标记有哪些物品放入包中
selectedObject = [False for i in range(n)]
j = C
for i in range(n, 0, -1):
if bv[i][j] != bv[i-1][j]:
selectedObject[i-1] = True
j -= W[i-1]
return selectedObject, bv