贪心算法计算最优分解方案.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
西安邮电大学 (计算机学院) 课内实验报告 实验名称:贪心算法计算最优分解方案 专业名称: 班级: 学生姓名: 学号( 8 位): 指导教师: 实验日期: 2016 年 6 月 1 日 . 实验目的及实验环境 实验目的 : 熟悉并掌握贪心算法 实验环境 : windows7 vc6.0 编译器二 . 实验内容 题目描述 : 设 n 是一个正整数。现在要求将 n 分解成干互不相同的自然数的和,且使这些自然数的成绩最大。 算法设计 : 对于给定的正整数 n,编程计算最优分解方案。 三.方案设计 问题分析 : 若 a+b=n,则 |a-b| 越小,那么, a*b 越大。贪心策略 : 将 n 分解成从 2 开始的连续自然数的和,优先的方式下均匀地分给前面各项。如果最后剩下一个数,将此数加到后项中。 例如 : 对于 8 进行分解为 2 和 3 则剩下一个 3; 然后 2 和 3 再分别从 3 中均匀地获得 1 最后变成 3 和 4,最后剩下 1 加给 4 上。所以,最终分解成 3 和 5,是 8 的分解为不相同的自然数乘机最大。 程序流程图 : 否 是 是 否 是 四.测试数据及运行结果 1.正常测试数据( 3 组)及运行结果; 五.总结 1. 实验过程中遇到的问题及解决办法; 问题 : 逻辑不清晰。 解决办法 : 画出流程图 2.对设计及调试过程的心得体会。 贪心算法是从问题的某个初始解出发逐步,逼近给定的目标,以尽可能快地求得更好的解。当达到某一步不能继续前进时,算法停止。这时就得到了问题的一个解。但不能保证求得的解是最优的。贪心算法的优点在于时间复杂度低。贪心算法与其他最优化算法的区别在于 : 它具有不可后撤性,可以有后效性,一般情况下,不能满足最优化原理。贪心算法的特点就决定了它的使用范围,它一般不适用 于解决可行性问题。仅适用于较容易得到可行性解得最优性问题。 ( 这里较容易得到可行解得概念 : 当前的策略选择后,不会或极少出现无解的情况。交互性题目,贪心算法是一个较好的选择。 ) 六.附录:源代码(电子版) /* 用贪心算法解题 : 设 n 是一个正整数。 现在要求将 n 分解为若干互不相同的自然数的和,且使这些自然数的乘积最 大 */ #define _CRT_SECURE_NO_WARNINGS #includestdio.h void taixin(int n){ int a[100];//  临时数组,保存分解后的数 int k = 1;//a  数组的索引 int sum = 1;//  最大乘积 int i;//  索引 if (n 5){//  如果小于  5,那么都是乘积是  1*n  ; sum = n; } else{ a[1] = 2; n -= 2; while (n a[k]){ k++; a[k] = a[k - 1] + 1; n = n - a[k]; } if (n == a[k]){ a[k]++; n--; }// 让最后一个先加 1,其实算上后面的是加了 2 for (i = 0; i n; i++){ a[k - i]++; } for (i = 1; i = k; i++){ sum *= a[i]; } printf( 分解后的数 :); for (i = 1; i =k; i++){ printf(%d ,a[i]); } } printf(\n 最大的成绩 : %d, sum); getchar(); } void main(){ int n; char str[50]; sprintf(str,%s, 请输入一个正整数 :); printf(str); scanf(%d,n); taixin(n); getchar(); return 0; }

文档评论(0)

135****4203 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档