贪心算法之最优分解 c语言,贪心算法计算最优分解方案.docx

西安邮电大学

(计算机学院)

课内实验报告

实验名称:贪心算法计算最优分解方案

专业名称:

班级:

学生姓名:

学号( 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值