Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279530
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类: C/C++

2010-11-07 20:18:57

百鸡问题

输入:所购买的3种鸡的总数目n

输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]

1. void chicken_question(int n,int &k,int g[],int m[],int s[])

2. {

3.     int  a,b,c;

4.     k = 0;  

5.     for (a=0;a<=n;a++){

6.         for (b=0;b<=n;b++){

7.             for (c=0;c<=n;c++) {

8.                 if ((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)) {

9.                     g[k] = a;

10.                     m[k] = b;

11.                     s[k] = c;

12.                     k++;   

13.                 }   

14.             }

15.         }

16.     }

17. }

 

这个算法有三重循环,主要执行时间取决于第7行开始的内循环的循环体的执行次数。外循环的循环体执行n+1次,中间循环的循环体执行(n+1)(n+1)次,内循环的循环体执行(n+1)(n+1)(n+1)次。当n=100时,内循环的循环体执行次数大于100万次。

考虑到n元钱只能买到n/5只公鸡,或n/3只母鸡。因此,有些组合可以不必考虑。而小鸡的只数又与公鸡及母鸡的只数相关,上述的内循环可以省去。

 

改进的百鸡问题

输入:所购买的3种鸡的总数目n

输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]

1. void chicken_problem(int n,int &k,int g[],int m[],int s[])

2. {

3.     int  i,j,a,b,c;

4.     k = 0;

5.     i = n/5;

6.     j = n/3;

7.     for (a=0;a<=i;a++){

8.        for (b=0;b<=j;b++) {

9.             c = n–a–b;

10.             if ((5*a+3*b+c/3==n)&&(c%3==0)) {

11.                 g[k] = a;

12.                 m[k] = b;

13.                 s[k] = c;

14.                 k++;

15.             }

16.         }

17.     }

18. }

 

算法有两重循环,主要执行时间取决于第8行开始的内循环,其循环体的执行次数是(n/5+1)(n/3+1)。当n=100时,内循环的循环体的执行次数为21*34=714次,这和100万次比较起来,仅是原来的万分之七,有重大的改进。

对某类特定问题,在规模较小的情况下,穷举法往往是一个简单有效的方法。

阅读(965) | 评论(0) | 转发(0) |
0

上一篇:求和

下一篇:n个数第k个大

给主人留下些什么吧!~~