动态规划解决算法背包问题实验报告含源代码_第1页
动态规划解决算法背包问题实验报告含源代码_第2页
动态规划解决算法背包问题实验报告含源代码_第3页
动态规划解决算法背包问题实验报告含源代码_第4页
动态规划解决算法背包问题实验报告含源代码_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安邮电大学(计算机学院)课内实验报告实验名称:动态规划专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:实验日期:2023年5月9日实验目的及实验环境使用动态规划法和回溯法生成两个长字符串的最优化比对结果通过实际案例,领略算法的执行效率。掌握动态规划、贪心算法、回溯法、分支限界法的原理,并可以按其原理编程实现解决0-1背包问题,以加深对上述方法的理解。实验环境:VisualC++6.0二.实验内容1.设计一个O(n^2)时间的算法,找出由n个数组成的序列的最长单调递增子序列2.将算法分析题3—1中算法的计算时间减至O(nlogn)3.给定n种物品和一个背包。物品i的重量是,其价值为,背包容量为C。问应当如何选择装入背包的物品,使得装入背包中物品的总价值最大?三.方案设计1.动态规划的一个计算两个序列的最长公共子序列的方法如下:以两个序列X、Y为例子:设有二维数组f[i,j]表达X的i位和Y的j位之前的最长公共子序列的长度,则有:f[1][1]=same(1,1);f[i,j]=max{f[i-1][j-1]+same(i,j),f[i-1,j],f[i,j-1]}其中,same(a,b)当X的第a位与Y的第b位相同时为“1”,否则为“0”。此时,二维数组中最大的数便是X和Y的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。该算法的空间、时间复杂度均为O(n^2),通过优化后,空间复杂度可为O(n)。核心代码:voidLCSL(intm,intn,int*x,int*y,intc[][N],intb[][N]){c[0][0]=0;inti,j;for(i=1;i<=m;i++)c[i][0]=0;for(i=1;i<=n;i++)c[0][i]=0;for(i=1;i<=m;i++)for(j=1;j<=m;j++){if(x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}elseif(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{c[i][j]=c[i][j-1];b[i][j]=3;}}cout<<c[m][m]<<endl;}voidLCS(inti,intj,int*x,intb[][N]){if(i==0||j==0)return;if(b[i][j]==1){LCS(i-1,j-1,x,b);for(inty=1;y<i;y++)if(x[y]==x[i])return;cout<<x[i]<<"";}elseif(b[i][j]==2){LCS(i-1,j,x,b);}elseLCS(i,j-1,x,b);}voidQuickSort(inta[],intp,intr){if(p<r){intq=Partition(a,p,r);QuickSort(a,p,q-1);//对左半段排序QuickSort(a,q+1,r);//对右半段排序}}通过动态规划求出最长公共子序列,再用任意排序算法,得出最长单调递增序列,我选用的排序方法是快速排序。一个长度为i的候选子序列的最后一个元素至少与一个长度为i-1的候选子序列的最后一个元素同样大,通过只想输入序列中元素的指针来维持候选子序列。3.0/1背包问题:现有n种物品,对1<=i<=n,第i种物品的重量为正整数Wi,价值为正整数Vi,背包能承受的最大载重量为正整数C,现规定找出这n种物品的一个子集,使得子集中物品的总重量不超过C且总价值尽量大。动态规划算法描述:根据问题描述,可以将其转化为如下的约束条件和目的函数:寻找一个满足约束条件,并使目的函数式达成最大的解向量,使得,并且达成最大。0-1背包问题具有最优子结构性质。假设是所给的问题的一个最优解,则是下面问题的一个最优解:。假如不是的话,设是这个问题的一个最优解,则,且。因此,,这说明是所给的0-1背包问题比更优的解,从而与假设矛盾。按照上面的情况,可以得到递推公式:设最优值为m(i,j)。 max{m(i+1,j),m(i+1,j-)+}m(i,j)= m(i+1,j) m(n,j)=0#include<stdio.h>intV[200][200];//前i个物品装入容量为j的背包中获得的最大价值intmax(inta,intb){if(a>=b)returna;elsereturnb;}intKnapSack(intn,intw[],intv[],intx[],intC){inti,j;for(i=0;i<=n;i++)V[i][0]=0;for(j=0;j<=C;j++)V[0][j]=0;for(i=0;i<=n-1;i++)for(j=0;j<=C;j++)if(j<w[i])V[i][j]=V[i-1][j];elseV[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); j=C;for(i=n-1;i>=0;i--){if(V[i][j]>V[i-1][j]){x[i]=1;j=j-w[i];}elsex[i]=0;}printf("选中的物品是:\n");for(i=0;i<n;i++)printf("%d",x[i]);printf("\n");returnV[n-1][C];}voidmain(){ints;//获得的最大价值intw[15];//物品的重量intv[15];//物品的价值intx[15];//物品的选取状态intn,i;intC;//背包最大容量n=5;printf("请输入背包的最大容量:\n");scanf("%d",&C);printf("输入物品数:\n");scanf("%d",&n);printf("请分别输入物品的重量:\n");for(i=0;i<n;i++)scanf("%d",&w[i]);printf("请分别输入物品的价值:\n");for(i=0;i<n;i++)scanf("%d",&v[i]);s=KnapSack(n,w,v,x,C);printf("最大物品价值为:\n");printf("%d\n",s);}运营结果1.2.3.五.心得体会通过这次实验,对动态规划法求最长公共子序列有更深的理解。其实无非就是抓住书上的递推公式进行写,动态规划依赖于上一个或者上一行的解,就是在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论