ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:95.54KB ,
资源ID:887983      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/887983.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计报告背包问题求解余玲.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计报告背包问题求解余玲.docx

1、数据结构课程设计报告背包问题求解余玲数据结构课程设计题 目 背包问题求解 学生姓名 余 玲 指导教师 张晨光 学 院 信息科学技术学院 专业班级 2011级 数学与应用数学 2班 完成时间 2013年12月27日 第一章 课程设计目的 2第二章 课程设计内容和要求 22.1课程设计内容 22.2 课程设计要求 32.3 运行环境 3第三章 课程设计分析 33.1递归算法简介 33.2 算法基本思想 33.3 背包问题求解 4第四章 算法(数据结构)描述 44.1 背包问题结构体 44.2 质量及价值要求 54.3 算法流程图 5第五章 源代码 6第六章 运行结果分析 8第七章 结束语 8第八章

2、 参考文献 9第一章 课程设计目的在大二下学期学习了C+程序设计课程的基础上,本学期我们学习了数据结构(用面向对象方法与C+语言描述)这门课程。数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科,是一门实践性非常强的课程,不仅需要在课堂上认真学习理论知识,更需要在课下自己在电脑上进行编程实验,以做到学以致用。为更好地理解与运用所学知识,提高动手能力,学校安排并进行了此次课程设计实习。该课程不但要求实习者掌握数据结构(用面向对象方法与C+语言描述)中的各方面知识,还要求实习者具备一定的语言基础和编程能力。能够分析研究计算机加工的对象的特性,获得其逻辑结构,

3、根据需求,选择合适存储结构及其相应的算法;学习一些常用的算法;复杂程序设计的训练过程,要求编写的程序结构清楚和正确易读;初步掌握算法的时间分析和空间分析技术;具体说来,这次课程设计主要有两大方面目的。一是通过实习让实习者掌握数据结构(用面向对象方法与C+语言描述)中的知识。对于背包问题求解这一课题来说,所要求掌握的数据结构知识主要有:递归算法。背包问题是一个典型的组合优化问题,本课程设计用递归算法求解背包问题,就是在资源有限的条件下,追求总的最大收益的资源有效分配问题;二是通过实习巩固并提高实习者的Visual C+语言知识,提高其编程能力与计算机专业水平。第二章 课程设计内容和要求2.1课程

4、设计内容设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和为最大。为使得问题更加清晰明了,我们将其转换为:给定n种不同的物品和一个背包,物品i的质量是Wi,背包容量是M,假定物品i的一部分xi(0xi1),被放进背包里,就会得到利润Pixi。因为背包的容量是M,要求被装进的物品的总质量不超过M(若只考虑物重而不考虑其形状和体积)问应怎样选择物品的种类和数量,使背包装满,而获得最大利润。此类问题的形式化描述是:给定M0,Wi0,Pi0,1in,要求找出一个n元向量(x1, x2,xn),0xi1,1in,使之满足约

5、束条件,使目标函数达到最大.满足0x1的任何向量都是一个可能解.而最佳解必需是使目标函数的值达到最大的一个可能解.当约束xi为正整数时称为整数背包,当约定xi=0或xi=1时称为0 -1背包.2.2 课程设计要求(1)分别输入n件物品的重量和价值(2)采用递归寻找物品的选择方案.(3)输出最佳的装填方案:包括选中的是哪几种物品,总价值为多少。.2.3 运行环境该程序的运行环境为Windows 7系统,Microsoft Visual Studio 2012版本。第三章 课程设计分析3.1递归算法简介本课题要求采取递归的算法。递归是设计和描述算法的一种有力的工具,能采用递归描述的算法通常有这样的

6、特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,然后从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。3.2 算法基本思想递归算法根本思想是假设用布尔函数knap(s,n)表示n件物品放入可容质量为s的背包中是否有解(当knap函数的值为真时说明问题有解,其值为假时无解).我们可以通过输入s和n的值,根据它们的值可分为以下几种情况讨论:(1)当s=0时可知问题有解,即函数knap(s,n)的值为true;(2)当s0且n0且n1时才符合实际

7、情况,这时又分为两种情况:(1)选择的一组物体中不包括Wn则knap(s,n)的解就是knap(s,n-1)的解.(2)选择的一组物体中包括Wn则knap(s,n)的解就是knap(s-Wn,n-1)的解.这样一组Wn的值就是问题的最佳解.这样就将规模为n的问题转化为规模为n-1的问题.综上所述0 -1背包问题的递归函数定义为:采用此法求解0 -1背包问题的时间复杂度为O(n)。上述算法对于所有物品中的某几件恰能装满背包时能准确求出最佳解。但一般情况是对于某一些物品无论怎么装都不能装满背包,必须要按背包的最大容量来装。对于这种装不满的背包它的解决办法是这样的:按所有物品的组合质量最大的方法装背

8、包,如果还装不满,则我们可以考虑剩余空间能否装下所有物品中最小的那件,如果连最小的都装不下了则说明这样得到的解是最佳解,问题解决。这样我们必须先找出所有n件物品中质量最小的那件(它的质量为Min),但是为了问题的解决我们不能增加运算次数太多,并且必须运用上述递归函数。那么我们可通过修改s的值即背包的容量,从背包容量s中减去k(它的值是从0到Min -1之间的一个整数值),再调用递归函数。当k=0时即能装满背包,其它值也能保证背包能最大限度装满,这样所有问题都解决了。3.3 背包问题求解 设n 件物品的重量分别为w0、w1、wn-1,物品的价值分别为v0、v1、vn-1。采用递归寻找物品的选择方

9、案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option ,该方案的总价值存于变量maxV。当前正在考察新方案,其物品选择情况保存于数组cop 。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxV时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxV大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。对于第i件

10、物品的选择考虑有两种可能:(1)考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。 (2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。就此,通过不断地对从第一件开始的物品到第n件物品进行选择或是不选择,从而从各个方案的比较中选择出最优方案。 采用option和cop两个数组来辅助完成递归寻找物品的选择方案。数组option起到一个“旗帜”作用,用来区别于未被选择的物品,从而达到输出被选择的函数。而cop则像是一个中间变量,它在递归过程中不断地发生变化,将有效的最终数据传输给数组option,起

11、到一个桥梁作用。第四章 算法(数据结构)描述4.1 背包问题结构体struct /物品结构 int weight; int value;aN;4.2 质量及价值要求find(物品i当前选择已达到的重量和tw以及本方案可能达到的总价值tv)/考虑物品i包含在当前方案中的可能性if(包含物品i是可以接受的)将物品i包含在当前方案中;if(in-1) find(i+1,tw+物品i的重量,tv);else/又一个完整方案,因为它比前面的方案好,以它作为最佳方案以当前方案作为临时最佳方案保存;恢复物品i不包含状态;/考虑物品i不包含在当前方案中的可能性if(不包含物品i仅是可考虑的)if(in-1)

12、find(i+1,tw,tv-物品i的价值);else/又一个完整方案,因它比前面的方案好,以它作为最佳方案以当前方案作为临时最佳方案保存;4.3 算法流程图 开始 键入对应质量和价值 键入最大的承受重量 物品i是否被选择 不超过限制重量 可获得更大价值组 获得最优组合 输出选中物品及总价值 图4-1 算法流程图第五章 源代码#include#define N 100int limitW, /背包指定的限制重量 totV, /全部物品的总价 maxV; /可实现的最大总价值int optionN, /方案的选择 copN; /当前的方案选择struct /物品结构 int weight; in

13、t value;aN;int n; /物品种类数void find(int i,int tw,int tv) int k; if(tw+ai.weight=limitW) /考虑物品i包含在当前方案中的可能性 copi=1; if(in-1) find(i+1,tw+ai.weight,tv); else for(k=0;kmaxV) /考虑物品i不包含在当前方案中的可能性 if(in-1) find(i+1,tw,tv-ai.value); else for(k=0;kn;k+) optionk=copk; maxV=tv-ai.value; void main() int k,w,v; p

14、rintf(请输入物品的种类数:); scanf(%d,&n); for(totV=0,k=0;kn;+k) printf(第%d物品的重量和价值:,k+1); scanf(%d%d,&w,&v); ak.weight=w; ak.value=v; totV+=v; printf(请输入背包的限制重量:); scanf(%d,&limitW); maxV=0; for(k=0;kn;+k) copk=0; find(0,0,totV); printf(最佳填装方案是:n); for(k=0;kn;+k) if(optionk) printf(第%d种物品n,k+1); printf(背包的总价值为:%dn,maxV);第六章 运行结果分析此处我们举一个小数据事例对程序进行验证:假设有5种不同质量不同价值的物品需要放进限制重量为10kg背包,其重量和价值如表6-1所示: 表6-1 事例数据物品编号重量(kg) 价

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1