小鸡购买问题

来源:互联网 发布:license管理系统源码 编辑:程序博客网 时间:2024/04/27 17:09

小鸡购买穷举算法之性能优化

一、穷举算法介绍

穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。

二、穷举算法解决问题一般流程

1.先了解问题求解,简化模型。

2.列出问题可以简化的最小解范围。

3.拟定一个顺序,一一带入解进行运算,直至得出正解。

4.优化算法。

三、穷举算法程序设计模板

void solve()

{

for (i == 解最小范围; i <最大范围; 递进值加入)

{

                   If(解的判定程序)

                    printf(输出语句);

}

}

***可以增加循环语句,进一步增加值控。

四、穷举算法优化策略

1.      消除一些无关紧要的条件。

2.      简化一些便于简化的值范围

3.      减少循环次数,转化为数学式子。

五、问题实例剖析

1.问题描述

百元买百鸡问题

用一百元去买鸡,要买的数量为一百只,要刚好用完一百元,并买一百只鸡。约束条件为,公鸡五元一只,母鸡三元一只,小鸡一元三只,三种鸡都要买。

2.程序流程

void solve()

{

for(i= 大鸡最小值; i < 大鸡最大值; 大鸡数量递进关系)

           for(j = 母鸡最小值;j < 母鸡最大值;母鸡数量递进关系)

                    for(k= 小鸡最小值;k < 小鸡最大值;小鸡数量递进关系)

                    {

                    If(I + j + k == 100 && 5 * i + 3 * j + z / 3 = =100)

                    printf(可能的所有值输出);

}

}

3.运行结果与分析

 程序虽然计算机可以较为简单的做此类计算,但程序循环次数还是较多,小鸡的最大数目的改变,公鸡,母鸡,小鸡之间的关系的表达,都可以解决,使得算法更加简练。

4.优化策略及其实现

优化一

本次优化,优化策略是在公鸡数量出现之后,利用公鸡数量来计算母鸡最大可买数量,然后再用公鸡及母鸡数量确定小鸡数量最大值。这样可以简化很多不必要循环,排除多个无效值。

优化2

本次优化,不去循环求解小鸡的值,而是在公鸡和母鸡已知情况下,直接算出小鸡的值,这样便有少了许多小鸡的循环值。

优化三

本次优化是在优化二的基础上利用5x+3y+Z/3=100和x+y+z=100这两个式子导出x(公鸡)和y(母鸡)之间的关系y=(200-14x)/8,这样就又简略了一重循环,其实在这之后只简化到20次循环,但由于利用数量关系5x+z/3<100和x+z=100可以简化一部分答案,这是因为当公鸡数量出来时,只剩小鸡和母鸡来填充100这个数量,又由于小鸡比较便宜,必定成为数量填充主力军,但当公鸡数量比较大时,剩下的钱买的小鸡都不够填充100这个数量,必定会舍弃后面一个范围的值。

5.过程及结果过分析比较

整个优化过程还是比较有系统性的,总体本着减少循环,减少范围的方向去,利用题目数量之间的关系得出各变量之间关系式,导出互相关系以剃去坏值,但当循环减少时计算的数量在增加,所以有必要在处理时间和循环次数之间取得平衡。

六、总结

本次对小鸡算法的探讨,在一定程度上改变了我对算法的认知,从六万多次循环到十几次,让我明白一个好的算法设计,对一个程序的影响非常之大,也明白算法并不是去放给电脑的东西,而且还是一个具有程序员生命的东西。所以重视算法是一个软件成功具有美丽UI而完善其“内涵”的重要环节。

 

0 0