百钱买百鸡问题,买鸡问题的解决方案

 百鸡百钱问题

设母鸡每只5元,公鸡每只3元,小鸡1元3只。现用100元买100只鸡,求出所有可能的解。

答案  注:
X表母鸡 ,Y表公鸡,  Z表小鸡,
X=0, Y=25,  Z=25
X=4, Y=18,  Z=26
X=8, Y=11,  Z=27
X=12, Y=4,  Z=28 

解决这个问题肯定是没有问题滴,不过要看你的解决方案的效率。

最原始的想法应该是用三个for循环去实现:
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
for(int k= 0 ;k<100;k++)
{
if((i+j+3*k==100)&&(5*i+3*j+k==100))
{
System.out.println("X=" + i + ", Y=" + j + ",  Z="
+ k);
}
}
}
}

优化一:(喜哥最初方案)
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 30; j++)
{
for(int k= 0 ;k<100;k=k+3)
{
if((i+j+k==100)&&(5*i+3*j+k/3==100))
{
System.out.println("X=" + i + ", Y=" + j + ",  Z="
+ k/3);
}
}
}
}
优化二:(我方案)
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 33; j++)
{
if (((100 - i - j) % 3 == 0)
&& ((100 - i - j) / 3 + 5 * i + 3 * j == 100))
{
System.out.println("X=" + i + ", Y=" + j + ",  Z="
+ (100 - i - j) / 3);
}
}
}

优化三:(宏伟方案)
for (int i = 0; i <= 20; i++)
{
for (int j = 0; j <= 33; j++)
{
if ((100 - i*5 - j*3)*3 + i + j == 100)
{
System.out.println("X=" + i + ", Y=" + j + ",  Z="
+ (100 - i - j) / 3);
}
}
}

优化四(执行时间相当最少)
for (int i = 0; i <=12; i++)
{
for (int j = 0; j <= 25; j++)
{
if ((100 - i*5 - j*3)*3 + i + j == 100)
{
System.out.println("X=" + i + ", Y=" + j + ",  Z="
+ (100 - i - j) / 3);
}
}
}

现在来分析下上面几种方案,
首先是最原始方案,这是最容易想到的方法。一拿到这个题目时我最初的想法也是用三个循环去实现。但真正去实现时候,却直接跳过去了。至于实现时自己为啥没想用此方法,估计是已经受到思想潜移默化的影响,将其直接忽视,跳入下一较优化的思想方案。最原始的方案思想就是将所有组合一一列出,不管其是否是多余的,然后一一判断将满足条件的方案打印出来。
优化一:大大缩小了不可能满足条件的组合。执行效率提高了一半还多。但还是有改善余地。
优化二、三:乍一看跟宏伟的差不多,其实不然,特别是if判断语句,鸿伟里面只用到了加减乘运算符,而我多加了除和余运算,后面宏伟告诉我才知道运算符执行效率问题,之前根本就没这个意识。加减乘除执行效率依次降低,执行时间依次增加。直接移位的执行效率相对较高,这让我联想到安哥程序里面多次用到了左移与右移来实现整型与数组型之间的转换,原来这也跟执行效率有关系滴。从宏伟程序里面显然反映出来了,如果我们还不了解此方面知识,是感受不到它的精简之所在。
优化四的话,是先从数学角度算出了他们的范围,然再想出来滴。实际意义可能小了点,但也不失为一种好的解决方案。

穷举法,易坚一直谈到它的精髓,我的理解是穷举就是将所有可能的结果一一找出,然后在从中找到符合要求的答案。至于它的精髓,我目前的理解是将其灵活运用到实际问题的解决中去,使之成为自己的一种思想工具。后上网查了下差不多是这个概念。它常用于密码破译,有人称为暴力破解法。宏伟在此基础上有了自己新的理解,他将其发散性地运用到实际问题解决中。面对一个问题他可能会想到多种解决方案,然后将其罗列出来,相当于穷举所有的解决方案,然后在预估每一种方案的可行性和效率问题,最后选出自认为最易实现的方案执行。在此也提出来供大家参考分享下。




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值