add python code

This commit is contained in:
2026-06-16 09:35:51 +08:00
parent daecbf4603
commit daf9e50938
17 changed files with 763 additions and 19 deletions
+47
View File
@@ -0,0 +1,47 @@
"""
0/1 背包问题 — 动态规划经典问题
给定容量 W 和价值/重量数组,求最大价值
"""
def knapsack_01(weights, values, W):
"""0/1背包 DP 解法"""
n = len(weights)
# dp[i][w] 表示前 i 个物品在容量 w 下的最大价值
dp = [[0] * (W + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(1, W + 1):
if weights[i - 1] <= w:
# 选或不选当前物品
dp[i][w] = max(
dp[i - 1][w],
dp[i - 1][w - weights[i - 1]] + values[i - 1]
)
else:
dp[i][w] = dp[i - 1][w]
return dp[n][W]
def knapsack_01_optimized(weights, values, W):
"""空间优化版:一维数组"""
dp = [0] * (W + 1)
for i in range(len(weights)):
for w in range(W, weights[i] - 1, -1):
dp[w] = max(dp[w], dp[w - weights[i]] + values[i])
return dp[W]
if __name__ == "__main__":
weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
W = 8
result1 = knapsack_01(weights, values, W)
result2 = knapsack_01_optimized(weights, values, W)
print(f"物品重量: {weights}")
print(f"物品价值: {values}")
print(f"背包容量: {W}")
print(f"最大价值 (二维DP): {result1}")
print(f"最大价值 (一维优化): {result2}")
+47
View File
@@ -0,0 +1,47 @@
"""
最长公共子序列 (LCS) — 动态规划
比较两个序列的相似度
"""
def lcs_length(X, Y):
"""计算 LCS 长度并返回 DP 表"""
m, n = len(X), len(Y)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if X[i - 1] == Y[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[m][n], dp
def lcs_backtrack(X, Y, dp):
"""回溯找出 LCS 序列"""
i, j = len(X), len(Y)
result = []
while i > 0 and j > 0:
if X[i - 1] == Y[j - 1]:
result.append(X[i - 1])
i -= 1
j -= 1
elif dp[i - 1][j] > dp[i][j - 1]:
i -= 1
else:
j -= 1
return ''.join(reversed(result))
if __name__ == "__main__":
X = "ABCBDAB"
Y = "BDCABB"
length, dp_table = lcs_length(X, Y)
lcs_str = lcs_backtrack(X, Y, dp_table)
print(f"序列 X: {X}")
print(f"序列 Y: {Y}")
print(f"LCS 长度: {length}")
print(f"LCS 序列: {lcs_str}")