百钱百鸡

1只公鸡值5文钱;1只母鸡值3文钱;3只小鸡值1文钱。请问用文钱买100只鸡,公鸡、母鸡和小鸡各有几只?

实际题目中会按照M文钱买N只鸡的形式

按公鸡母鸡小鸡的顺序分别输出结果,一组解答占一行,解答按照公鸡数目从大到小排序(其次母鸡,再次小鸡)

无解时请输出 no answer

 

如输入为:

100 100

则输出:

12 4 84

8 11 81

4 18 78

0 25 75

 

如输入为:

1 4

则输出为:

no answer

 

 

Hint

利用循环穷举所有可能

 

标答

1.#include<stdio.h>
2.int main() {
3.    int a, b, c;
4.    int money, number, flag;
5.    scanf("%d %d", &money, &number);
6.    flag = 0;
7.    for (a = money/5; a >= 0; a--)
8.        for (b = money/3; b >= 0; b--)
9.            for (c = money; c >= 0; c--) {
10.                if (a + b + c*3 == number && a*5 + b*3 + c == money) {
11.                        flag++;
12.                        printf("%d %d %d\n", a, b, c*3);
13.                    }
14.            }
15.    if ( flag == 0 )
16.        printf("no answer\n");
17.    return 0;
18.}

  

这题我也开始循环都是用for(a = 0; a < number; a++),导致超时了,所以需要优化,这题终端值都不是用0和number,

从money/5开始是因为输出要从大到小输出

这题相当于解方程组,xiao + gong + mu = number;  xiao / 3+gong * 5 + mu * 3= money;

以后凡是涉及解方程组用for循环求解的,均要注意:临界值,至多2个循环即可,否则易超时(1秒等于千万级别运算次数)

还有一道换硬币的也是,我一开始用3个循环,超时超时超时,然后用了一个变量用另两个代替减少了一个for后就过了

 

 

我的

 1 #include<stdio.h>
 2 int main() {
 3     int m, n, xiao, gong, mu, flag = 0;
 4     scanf("%d %d", &m, &n);
 5     for (gong = m/5; gong >=0; gong--) {
 6         for (mu = m/3; mu >= 0; mu--) {
 7            xiao = n - gong - mu;//用另外2个变量表示第三个变量,减少循环就过了
 8            if (xiao % 3 == 0 && xiao / 3 + mu * 3 + gong * 5 == m && xiao >= 0) {
 9                 printf("%d %d %d\n", gong, mu, xiao);//xiao >= 0这个条件莫忘,一开始
10                 flag = 1;、、忘了就没有过
11             }
12         }
13     }
14     if (flag == 0)
15     printf("no answer\n");
16     return 0;
17 }

 

posted on 2016-01-10 18:41  _阿赞  阅读(308)  评论(0编辑  收藏  举报