计算机科学与工系.docVIP

  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文档。上传文档
查看更多
计算机科学与工程系 《高级语言程序设计》 课程设计报告 课程设计题目:背包问题 指导教师:张 星 仝瑞阳 姓名:周飞 班级:0614073 学号:45 同组人员:赵鹏飞 程金英 目录 设计题目..................................................3 实验环境..................................................3 实验内容..................................................3 设计解决方案..............................................3 流程图、模块图及说明......................................4 设计程序..................................................6 设计中遇到的问题及解决方法...............................11 心得体会.................................................11 课程设计报告 【设计题目】 背包问题 【实验环境】 Windows XP , Microsoft Visual C++ 6.0 【设计内容】 有不同重量的物品n件,求从这n件物品中任取一部分物品放入背包,使选中的物品的总重量不超过指定的限制重量,但选中物品的价值之合为最大。即任意给定物品个数及它们的重量和价值,在最大的限制重量一定的情况下,为了使价值最大,选出最优解。 【设计解决方案】 动态规划:   动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干个子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的,若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费过多的时间。动态规划法又和贪婪算法有些一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。 二、算法框架: 1.在该背包问题中,其基本思路是:每件物品只有一件,可以选择取或者不取,同时需要根据限制质量c进行选择。从n 个物品中选取,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,物品的总重量不能超过限制的最大重量,最佳装载是指所装入的物品价值最高,即p1*x1+p2*x1+...+pi*xi(其1=i=n,x取0或1,取1表示选取物品i) 取得最大值。   利用最优序列由最优子序列构成的结论,可得到m 的递归式为:   当j=wi时: m(i,j)=max{f(i+1,j),f(i+1,j-wi)+vi} ①式 当0=jwi时:m(i,j)=f(i+1,j) ②式。这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。 “选择前i件物品放入限制质量为c的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品被选中”,价值为f[i-1][c];如果选第i件物品,那么问题就转化为“前i-1件物品放入剩下的限制质量为c-w[i]的背包中”,此时能获得的最大价值就是f[i-1][c-w[i]]再加上通过选中第i件物品获得的价值w[i]。 有一个主循环i=1..N,每次算出来二维数组f[i][0..c]的所有值。那么,如果只用一个数组f[0..c],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][c]呢?f[i][c]是由f[i-1][c]和f[i-1][c-w[i]]两个子问题递推而来,能否保证在推f[i][c]时(也即在第i次主循环中推f[c]时)能够得到f[i-1][c]和f[i-1][c-w[i]]的值呢?事实上,这要求在每次主循环中我们以c=C..0的顺序推f[c],这样才能保证推f[v]时f[c-w[i]]保存的是状态f[i-1][c-w[i]]的值。伪代码如下: for i=1..N for c=C..0 f[c]=max{f[c],f[c-w[i]]+w[i]}; 2.改进算法: 由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的i(1≤i≤n),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃点是这一类函数的描述特征。在一般情况下,函数m(i,j)由其全部跳跃点惟一确定。对每

文档评论(0)

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

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

1亿VIP精品文档

相关文档