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;
}
本文标签: 百鸡问题扩展
版权声明:本文标题:百鸡问题扩展 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1687943357a160351.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论