admin 管理员组

文章数量: 1086866

百鸡问题扩展

N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。
有几种买法呢?这就是N鸡问题。

输入格式:
在一行中输入一个正整数N。(N<500)
输出格式:
在一行中输出两个整数c s,中间用一个空格隔开,表示N元钱买N只鸡共有 c 种买法,且所有买法的公鸡数量之和是 s。
如果无解,则 s 为 -1.

输入样例1:
100
输出样例1:
4 24
输入样例2:
1
输出样例2:
0 -1
( 假设公鸡: X只,母鸡: Y只 ,小鸡 Z只,则有5x + 3y +1/3z = n , x+y+z = n z%3==0
利用循环 ,求解)

#include<stdio.h>
int main()
{int n;int c = 0,s = 0, i, j;scanf("%d",&n);for(i=0;i<=n/5;i++)  //公鸡只数范围{for(j=0;j<=n/3;j++)   //母鸡只数范围{for(k=0;k<3*n;k++)  //小鸡只数范围{if(5*i+3*j+k/3==n&&k%3==0&i+j+k==n){c++; //记录方法数s = s + i;}}}}if(c==0)s=-1;printf("%d %d",c,s);return 0;
}

由于三种鸡数量之和为N,所以可以用N和其中任意两种鸡数量的表示第三种鸡的数量,以此来减少循环次数
简化后得到

#include<stdio.h>
int main()
{int n;int c=0,s=0,i,j;scanf("%d",&n);for(i=0;i<=n/5;i++)  {for(j=0;j<=n/3;j++) {int k=n-i-j;  //用其它鸡的数量与 N 的关系表示小鸡数减少循环次数``if(5*i+3*j+k/3==n&&k%3==0){c++;s=s+i;}}}if(c==0)s=-1;printf("%d %d",c,s);return 0;
}

本文标签: 百鸡问题扩展