这篇文章讲述的是算法初级部分的百鸡百钱问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
百鸡百钱,假设一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用一百钱买一百只鸡,请问公鸡、母鸡、小鸡各多少只。
算法分析
假设公鸡cock只,母鸡hen只,则小鸡chicken只
可得出方程
1. cock + hen + chicken = 100
2. cock*5 + hen*3 + chicken/3 ;
若100钱全买公鸡,则能买33只,故公鸡cock的取值范围为0-20,
同理hen的取值范围为0-33,小鸡的取值范围为0-100。
代码实现
public class Q1_Chicken {
/**
* 问题描述:百鸡百钱,假设一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用一百钱买一百只鸡
* 请问公鸡、母鸡、小鸡各多少只。
*
* 算法思想:假设公鸡cock只,母鸡hen只,则小鸡chicken只
* 可得出方程 1. cock + hen + chicken = 100
* 2. cock*5 + hen*3 + chicken/3 ;
* 若100钱全买公鸡,则能买33只,故公鸡cock的取值范围为0-20,
* 同理hen的取值范围为0-33,小鸡的取值范围为0-100
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//穷举法:算法效率O(N*N*N)
int cock , hen , chicken ;
for(cock=0 ;cock <=20 ; cock++ )
for(hen=0 ; hen<=33 ; hen++ )
for(chicken=0 ; chicken<=100 ;chicken++){
if((cock + hen + chicken == 100) && (cock*5 + hen*3 + chicken/3.0 == 100)) //注意是除以3.0
System.out.println("公鸡:" + cock + "只,母鸡:" + chicken + "只,小鸡:" + chicken + "只");
}
//改进代码:算法效率O(N*N)
for(cock=0 ;cock <=20 ; cock++ )
for(hen=0 ; hen<=33 ; hen++ )
{
chicken = 100 - cock - hen ;
if((cock + hen + chicken == 100) && (cock*5 + hen*3 + chicken/3.0 == 100)) //注意是除以3.0
System.out.println("公鸡:" + cock + "只,母鸡:" + chicken + "只,小鸡:" + chicken + "只");
}
}
}
样例输出
公鸡:0只,母鸡:75只,小鸡:75只
公鸡:4只,母鸡:78只,小鸡:78只
公鸡:8只,母鸡:81只,小鸡:81只
公鸡:12只,母鸡:84只,小鸡:84只