网站大量收购独家精品文档,联系QQ:2885784924

动态规划-背包及最优二叉树汇总.pptx

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0/1背包 ;2;最优子结构 0/1背包的最优解具有最优子结构特性。 设 (x1, x2,… , xn),xi?{0,1}是0/1背包的最优解,那么,(x1 ,x2,… , xn-1) 必然是0/1背包子问题的最优解:背包载重C?wnxn,共有n-1件物品,第i件物品的重量为 wi,效益Vi,wi0,vi0,1?in。;4; 假如有容量为9的背包,要装入4种体积为2,3,4和5的物品,价值分别为3,4,5和7。 要在不超出背包容量的前提下,用某种方法尽可能多地在背包内装入物品,使总价值最大, 首先,准备一个标号为0到4共5行和标号从0起到9共10列的空的矩形表,接着用值0初始化0列和0行的元素 按如下办法直接填行1的值:m[1,j]=3(第一种物品的价值),当且仅当j≥2(第一种物品的体积)。 第二行中的每项m[2,j]有两种可能性,第一种可能性是置 m[2,j]=m[1,j]这相当于把第一种物品放入背包,2号物品放不下;第二种可能性是???m[2,j]=m[1,j-3]+4,它相当于加上第二种物品,使它或者仅包含第二种物品,或者同时包含第一种和第二种物品。当然,仅当j≥3时,才有可能加上第二种物品。继续这种方法,填入第3行和第4行,得到如图所示的表。 ;体积为2,3,4和5的物品,价值分别为3,4,5和7。;;Knapsack有两个较明显的缺点: 1.算法要求所给物品的重量w是整数 2.当背包容量c很大时,算法需要的计算时间比较多。;9;10;11;12;13;最优二叉搜索树 ;;;二叉搜索树的基本操作;;;;设有元素集合S={x1,x2,…,xn},其中,x1x2…xn。表示有序集S的二叉搜索树利用二叉树的结点来存储有序集中的元素。 二叉搜索树的叶子结点是形如( xi,xi+1 )的开区间。 在表示S的二叉搜索树中搜索一个元素x,返回的结果有两种情形: (1)在二叉搜索树的内结点中找到x=xi (2)在二叉搜索树的叶子结点中确定x属于( xi,xi+1 );22;p(i) 是在集合中成功查找xi 的概率,1?i? n,q(i)是待查元素x值满足 xixxi+1的概率,0?i? n(假定x0= ??, xn+1=+?)。 最优二叉搜索树问题是指设法构造一棵具有最小平均搜索时间的二叉搜索树。 ;设 c(0,n) 是由元素值集合{a1,…,an}所构造的最优二叉搜索树的代价,则;一般地,c(i,j) ,i?j 是元素值集合{ai+1,…,aj}所构造的最优二叉搜索树的代价,设r(i,j)=k为该树的根,要求结点k满足;例 设n=4且(a1,a2,a3,a4)=(Mon,Thu,Tue,Wed)。又设p(1:4)=(3,3,1,1)和q(0:4)=(2,3,1,1,1)。这里p和q都已乘了16。;;构造最优二叉搜索树 int Find(int i,int j,int **r,float**c) { float min=INFTY; int k; for (int m=i+1;m=j;m++) if ((c[i][m-1]+c[m][j])min) { min=c[i][m-1]+c[m][j];k=m; } return k; }; void CreateOBST(float* p,float* q, float **c,int **r,float**w,int n) { for (int i=0;i=n-1;i++) { w[i][i]=q[i];c[i][i]=0.0;r[i][i]=0; w[i][i+1]=q[i]+q[i+1]+p[i+1]; c[i][i+1]=q[i]+q[i+1]+p[i+1]; r[i][i+1]=i+1; } w[n][n]=q[n];c[n][n]=0.0;r[n][n]=0; ; for (int m=2;m=n;m++) for (i=0;i=n-m;i++) { int j=i+m; w[i][j]=w[i][j-1]+p[j]+q[j]; int k = Find(i,j,r,c); c[i][j] = w[i][j] + c[

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档