当前位置:实例文章 » 其他实例» [文章]dp算法篇Day7

dp算法篇Day7

发布人:shili8 发布时间:2024-12-23 06:10 阅读次数:0

**DP算法篇 Day7**

在前面的几天里,我们已经学习了DP算法的基本概念、动态规划表格的建立以及如何使用DP解决一些经典的问题。今天,我们将继续深入探讨DP算法的应用,特别是关于背包问题和最长上升子序列问题。

**1. 背包问题**

背包问题是一类经典的DP问题,它涉及到在一个背包中放入尽可能多的物品,而这些物品的重量或价值都有限制。我们可以将其视为一种选择问题,每个物品都有两种选择:放入背包还是不放。

**1.10/1 背包问题**

在这个版本中,我们只能选择一次背包中的物品,而不能多次选择同一个物品。假设我们有 n 个物品,每个物品的重量为 w_i,价值为 v_i,我们需要在背包容量为 W 的情况下放入尽可能多的物品。

def knapsack(W, wt, val, n):
 K = [[0 for w in range(W +1)] for i in range(n +1)]

 # Build table K[][] in bottom up manner for i in range(n +1):
 for w in range(W +1):
 if i ==0 or w ==0:
 K[i][w] =0 elif wt[i -1] <= w:
 K[i][w] = max(val[i -1] + K[i -1][w - wt[i -1]], K[i -1][w])
 else:
 K[i][w] = K[i -1][w]

 return K[n][W]


**1.2 多重背包问题**

在这个版本中,我们可以选择多次背包中的物品,每个物品都有一个数量限制。假设我们有 n 个物品,每个物品的重量为 w_i,价值为 v_i,我们需要在背包容量为 W 的情况下放入尽可能多的物品。

def knapsack(W, wt, val, n):
 K = [[0 for w in range(W +1)] for i in range(n +1)]

 # Build table K[][] in bottom up manner for i in range(1, n +1):
 for w in range(1, W +1):
 if wt[i -1] <= w:
 K[i][w] = max(val[i -1] + K[i -1][w - wt[i -1]], K[i -1][w])
 else:
 K[i][w] = K[i -1][w]

 return K[n][W]


**2. 最长上升子序列问题**

最长上升子序列问题是一类经典的DP问题,它涉及到在一个序列中找到尽可能长的上升子序列。我们可以将其视为一种选择问题,每个元素都有两种选择:放入上升子序列还是不放。

def longest_ascending_subsequence(arr):
 n = len(arr)
 dp = [1] * n for i in range(1, n):
 for j in range(i):
 if arr[i] > arr[j]:
 dp[i] = max(dp[i], dp[j] +1)

 return max(dp)


**总结**

在今天的文章中,我们学习了背包问题和最长上升子序列问题,这两类问题都是经典的DP问题。我们使用动态规划表格来解决这些问题,并提供了代码示例和注释。通过阅读这篇文章,读者应该能够理解背包问题和最长上升子序列问题的基本概念,并能够使用DP算法来解决这些问题。

其他信息

其他资源

Top