动态规划法求解背包问题.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法分析与设计实验报告 第 3次实验 姓名 杨玉茹 学号 201508010325 班级 计科1503 时间 3.31下午 地点 软件大楼330 实验名称 动态规划法求解背包问题 实验目的 通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。 实验原理 使用动态规划算法的原理,即将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。分析出背包问题的动态规划方程式,然后实现相应的代码,然后再进行再输入多组值进行验证,看输出结果,然后来验证自己的程序是否正确。 实验步骤 ① 首先求出最优子结构,设(y1,y2,...,yn)是所给0-1背包问题的一个最优解; ② 如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包,得出方程为: ??V(i,0)=V(0,j)=0 ③如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi?的背包中的价值加上第i个物品的价值vi;?(b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解: ? V(i,j)=V(i-1,j) ?jwi ? ? V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } jwi ④ 输入相应的测试值,进行判断程序的正确性; 关键代码 int Knap(int n,int w[],int v[],int x[],int C) { int i,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(jw[i]) V[i][j]=V[i-1][j]; else V[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]; } else x[i]=0; } printf(选中的物品是:\n); for(i=0;in;i++) printf(%d ,x[i]); printf(\n); return V[n-1][C]; } 测试结果 实验心得 通过这次实验,我回顾了0-1背包问题的动态规划算法,因此更加深刻的了解到动态规划算法的思想,由最优子结构来求解整个结构的最优结构,在进行实验的过程最重要的一步就是通过分析得到问题的动态规划方程,因此就根据动态规划方程来实现代码。这个过程中最难的一步就是分析得到动态规划方程,需要考虑各个可能的因素,最后再来用代码实现。这次的实验难度相比于前两次实验,明显难多了,但是对于动态规划算法的认识也颇多,理解也更加深刻了。 实验得分 助教签名 附录:完整代码 #includestdlib.h #includestdio.h int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值 int max(int a,int b) //一个大小比较函数,用于当总重大于第I行时 { if(a=b) return a; else return b; } int Knap(int n,int w[],int v[],int x[],int C) { int i,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(jw[i]) V[i][j]=V[i-1][j]; else V[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]; } else x[i]=0; } printf(选中的物品是:\n); for(i=0;in;i++) printf(%d ,x[

文档评论(0)

mmc566887 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档