LCS+完全背包

1、问题

LCS:给定序列X=<x1,x2,...,xm>,Y=<y1,y2,...,yj>,求X和Y的最长公共子序列。

完全背包:一个旅行者准备随身携带一个背包。可以放入背包的物品有 n 种,物品 j 的重量和价值分别为Wj,Vj,j=1,2,...,n 。如果背包的最大重量限制是 b,怎么选择放入背包物品以使得背包的价值最大。

2、解析

LCS:

转移方程

 过程推导

 

 

 

 

完全背包:

转移方程

 

推导过程

 

3、设计

 1 void LCS(int l,int r) {//输出方案
 2     if l<=0 or r<=0 
 3         return;
 4     if a[l] == b[r]
 5         LCS(l-1,r-1)
 6         cout<<a[l]
 7     else if dp[l-1][r] > dp[l][r-1]
 8         LCS(l-1,r)
 9     else 
10         LCS(l,r-1)
11 }
12 
13 for i <- 1 to lena  //转移过程
14     for j <- 1 to lenb
15         if a[i] == b[j]
16             dp[i][j] <- dp[i-1][j-1] + 1
17         else 
18             dp[i][j] <- max(dp[i-1][j],dp[i][j-1])
1 cin>>n>>m;
2 for i <- 1 to n 
3     cin>>w[i]>>v[i]    
4 for i <- 1 to n 
5     for j <- w[i] to m 
6         dp[j] <- max(dp[j],dp[j-w[i]]+v[i])
7 cout<<dp[m]<<endl;

4、分析

LCS需要两重循环DP,第一重为串A的长度O(N),第二重为串B的长度O(N),所以时间复杂度为O(N^2)

完全背包需要两重循环DP,第一重为物品数量O(N),第二重为背包容量O(W),所以时间复杂度为O(N*W)

5、源码

LCS

https://github.com/ChenyuWu0705/Algorithm-Analyze-and-Design/blob/main/LCS.cpp

完全背包

https://github.com/ChenyuWu0705/Algorithm-Analyze-and-Design/blob/main/complete%20bag.cpp

posted @ 2021-05-16 22:34  programmer_w  阅读(54)  评论(0编辑  收藏  举报