西安邮电大学
(计算机学院)
课内实验报告
实验名称:贪心算法计算最优分解方案
专业名称:
班级:
学生姓名:
学号( 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
#include
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;
}