- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 15
课题:购物单
指导教师:潘雷
所在院系:数学与信息技术学院
班级:09计本一班
学号姓名:陈珊珊
学号姓名:邱艾兰
学号姓名:王兵
日期:2011.12.09
摘 要
对计算机科学来说,算法的概念至关重要。从广义上讲,算法是指为解决一个问题而采用的方法和步骤;从程序计设的角度上讲,算法是指利用程序设计语言的各种语句,为解决特定的问题而构成的各种逻辑组合。
本次课程设计报告通过对“购物单”这道题目的分析与实现,来了解了算法设计课程中的几种适合这道题的主要算法:枚举法、递归法、贪婪法、动态规划。通过一道题使用的的不同算法,使学生更好的对比出算法之间的优势与劣势,从而找到参加信息技术奥赛时如何采用最优方法进行设计,同时对于C语言有数据结构有更好的认识。
关键词:数据结构,C语言设计,递归法,贪婪法,枚举法,动态规
实验目的:
运用本门课程上所学到的蛮力法、贪心算法、动态规划、蛮力法等算法来解决问题,在分析解决问题的过程中,培养学生的抽象思维和缜密概括的能力,指导中学生对算法进行分析,得到最优算法以参加信息技术奥赛。
问题描述:
小明评为省级三好学生,妈妈决定奖励他N元。小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等;用整数1-5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j 件物品的价格为V[j],重要度为W[j],共选中了k件物品,编号依次为j1,j2,j3……,jk,则所求总和为:
V[j1]*W[j1]+V[j2]*W[j2]+……+V[jk]*W[jk](其中*为乘号)
请你帮助小明设计一个满足要求的购物单。
问题分析
第j 件物品的价格为V[j],重要度为W[j],共选中了k件物品,编号依次为j1,j2,j3……,jk,用数组x[i]表示物品的状态(“0”为不买,“1”为买)
采用数学语言描述如下:
在 v[0]*x[0] + v[1] *x[1]+ +v[n-1]*x[n-1] N, x[i] = 0 或1 的条件下
求 w[0]*x[0] + w[1] *x[1]+ +w[n-1]*x[n-1] 的最大值。
解题方法:
算法一 采用枚举法进行运算。
算法思想:
枚举法是蛮力策略的一种表现形式,在解决问题时采取的一种“懒惰”的策略,也是一种使用非常普遍的思维方法。它是根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找出满足问题条件的解。
用枚举法解决问题,通常可以从两个方面进行算法设计。
找出枚举范围:分析问题所涉及的各种情况。
找出约束条件:分析问题的解需要满足的条件,并用逻辑表达式表示。
算法分析:
为了得到每件物品的价格与重要度的乘积的总和最大。 我们可以在 n 种物 品中,取其中的任意几件,因为每一件都可以取或不取,所以共有 2n 种取法,求出这2n 种取法各自的总重量和总价值,比较这些总重量和总价值,在满足总重 量m的条件下,找出总价值最大的值,就得到问题的解。
算法描述:
n个物品的价格和重要度分别存储于数组w[ ]和v[ ]中,限制钱数为N,用一个b数组来表示取数的标记,当b[i]=0时表示第i件物品不取,当b[i]=1时表示第i件物品已取,初始化全部取0。用枚举法解决问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。
显然,每个分量取值为0或1的n元组的个数共为2^n个。而每个n元组其实对应了一个长度为n的二进制数,且这些二进制数的取值范围为0~2^n -1.因此,如果把0~2^n -1分别转化为相应的二进制数,则可以得到我们所需要的2^n个n元组。
以下算法是通过B数组的取值把15种取法全部穷举出来,价值MAX初始化为0,限制钱数为40。
四件物品的价格分别为:12,14,10,20,对应的重要度为:3,2,5,3。
B[0]B[1]B[2]B[3]
00000 {初始化}
01000{取第1件物品,价格为12,不超,重要度为3,将MAX替换为36}
00100 {取第2件物品,价格为14,不超,重要度为2,不替换}
00010{取第3件物品,价格为10,不超,重要度为5,将MAX替换为50}
00001 {取第4件物品,价格为20,不超,重要度为3,不替换}
.
.
.
.
.
.
.
01110(最优选择,最大价值为10)
00111
01111
10000 {当B〔0〕=1时停止,B〔0〕称为哨兵
文档评论(0)