sicily 6272. n钱m鸡问题

Description

一只公鸡值五文钱;

一只母鸡值三文钱;三只小鸡值一文钱

。请问用n文钱买m只鸡的方案有多少种?

Input

输入有多个case,

每个case如下

n m

其中n,m <= 100,

输入以EOF结束。

Output

对于每个case输出一行,

这一行只有一个整数,表示解的个数

 

后记:除了小鸡数=总数-公鸡数-母鸡数以外,还可以用只有小鸡数能被3整除时才开始计算花费,而不是在枚举时检验花费的同时一起检验小鸡数是否能被3整除的方法进一步减少计算量。

一开始用做实验的算法直接提交,WA无数次,屡改屡败。

被报错n次的其中一种,用小鸡数=总数-公鸡数-母鸡数控制枚举次数

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int cock, hen, chick, n, m, cost, counter=0, num;
 5     
 6     while( scanf("%d%d", &n, &m ) != EOF )
 7     {
 8         for( cock = 0; cock <= n/5; cock++ )
 9         {
10             for( hen = 0; hen <= n/3; hen++ )
11             {
12                   chick = m - cock - hen;
13                 cost = cock * 5 + hen * 3 + (chick / 3);
14                 num = hen + chick + cock; 
15                  if ( (cost == n) && (num == m) && (chick % 3 ==0 )  )
16                   counter++;
17             }
18         }
19         printf("%d\n",counter);
20         counter = 0;
21     }
22     return 0;
23 } 

实在无奈,只好用比较笨的办法,三个循环,不控制枚举次数,居然成功AC了,但是run time达到了0.02sec

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int cock, hen, chick, n, m, cost, counter=0;
 5     
 6     while( scanf("%d%d", &n, &m ) != EOF )
 7     {
 8         for( cock = 0; cock <= n/5; cock++ )
 9         {
10             for( hen = 0; hen <= n/3; hen++ )
11             {
12                 for( chick = 0; chick <= 3*n; chick++ )
13                 {
14                     cost = cock * 5 + hen * 3 + (chick / 3);
15                     if ( (cost == n) && (hen + chick + cock == m) && (chick % 3 ==0 )  )
16                     counter++;
17                 }
18                 
19             }
20         }
21         printf("%d\n",counter);
22         counter = 0;
23     }
24     return 0;
25 }                                 

在自己看来这两种算法本质都差不多,实在想不通为什么会出现不同的情况。于是存下来自己设计测试对比,在用100 20测试的时候发现了不同。

AC的程序在用100 20测试时解出的是1,而WA的那个是5.

修改代码查看具体每种解法


问题关键出现了,第二种算法把小鸡数为负的状况也算进去了。在控制条件里再加一个小鸡数不小于0,成功AC,Run Time 0sec

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int cock, hen, chick, n, m, cost, counter=0, num;
 5     
 6     while( scanf("%d%d", &n, &m ) != EOF )
 7     {
 8         for( cock = 0; cock <= n/5; cock++ )
 9         {
10             for( hen = 0; hen <= n/3; hen++ )
11             {
12                 chick = m - cock - hen;
13                 cost = cock * 5 + hen * 3 + (chick / 3);
14                 num = hen + chick + cock; 
15                 if ( (cost == n) && (num == m) && (chick % 3 ==0 ) && (chick >= 0)  )
16                 {
17                     counter++;
18                 }
19             }
20         }
21         printf("%d\n",counter);
22         counter = 0;
23     }
24     return 0;
25 } 

还有一种更简单的办法,声明变量时使用unsigned,就直接避免了负数的出现,也AC了,Run Time 0sec

View Code

转载于:https://www.cnblogs.com/joyeecheung/archive/2012/11/01/2750438.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值