1、实验二、动态规划算法的应用班级:计 072学号:3070911052姓名:赵凯一、实验目的与实验内容1、掌握动态规划算法的基本设计思想与原则。2、最长公共子序列、0-1 背包,找零钱二、实验要求1用 C+/C 完成算法设计和程序设计并上机调试通过。2撰写实验报告,提供实验结果和数据。3分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。三、程序实现最长公共子序列:对字符串 X 和 Y,首先构建子问题最有值的递归关系。用 cij记录序列 Xi 和 Yj 的最长公共子序列的长度。其中 Xi=x1,x2,xi;Yj=y1,y2,yj.当 i=0或 j=0
2、时,空序列就是 Xi 和 Yj 的最长公共子序列。故此时 cij=0.其他情况下,由最优子结构性质可建立递归关系如下:0 i=0,j=0cij= ci-1j-1+1 i,j0;xi=yjmaxcij-1,ci-1j i,j0;xi=yj0-1 背包问题:设所给 0-1 背包问题的子问题max nk=ivkxk nk=ivkxk=wim(i+1,j) 0=wnm(n,j)= 0 0using namespace std;void LCSLength(int m,int n,char x,char y,int c8,int b8)/求最优值int i,j;for(i=1;i=cij-1)cij=c
3、i-1j;bij=2;else cij=cij-1;bij=3;void LCS(int i,int j,char x,int b8)/求最优解if(i=0|j=0)return;if(bij=1)LCS(i-1,j-1,x,b);coutxi;coutyj;coutusing namespace std;void tback(int m11,int t,int c,int n,int x);void knapsack(int v,int w,int c, int n,int m11)/最优值的求解过程int jmax=(wn-1)c?c:(wn-1);for(int j=0;j=0;i-)j
4、max=(wi-1c)?c:(wi-1);for(j=0;j(mi+1j-wi+vi)?mi+1j:(mi+1j-wi+vi);m1c=m2c;if(c=w1)m1c=m1c(m2c-w1+v1)?m1c:(m2c-w1+v1);int main()int i,j,n=5,c,x6,count=0;int v6;int w6;coutvi;coutwi;coutc;knapsack(v,w,c,n,m);for(i=1;iusing namespace std;void tback(int m11,int t,int c,int n,int x);void knapsack(int v,int
5、 w,int c, int n,int m11)/最优值int u=(wn-1)c?c:(wn-1);for(int j=0;j=0;i-)u=(wi-1c)?c:(wi-1);for(j=0;j(mi+1j-wi+vi)?mi+1j:(mi+1j-wi+vi);m1c=m2c;if(c=w1)m1c=m1c(m2c-w1+v1)?m1c:(m2c-w1+v1);int main()int i,j,n,c,x6=0,count=0;int t6;int co6;coutti;coutcoi;coutc;knapsack(co,t,c,n,m);for(i=1;i=n;i+)for(j=1;j=c;j+)coutmij“ “;coutendl;tback(m,t,c,n,x);cout“the result is:“;for(i=0;in;i+)if(xi) coutti“ “;count+;coutendl;cout“latest number=“count;return 0;void tback(int m11,int t,int c,int n,int x)/最优解for(int i=0;in;i+)if(mic=mi+1c)xi=0;elsexi=1;c-=ti;xn=(mnc)?1:0;