题目描述
用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只,z只。编程求解x,y,z所有可能解。
输入
测试数据有多组,输入n。
输出
对于每组输入,请输出x,y,z所有可行解,按照x,y,z依次增大的顺序输出。
样例输入
40
样例输出
x=0,y=0,z=100
x=0,y=1,z=99
x=0,y=2,z=98
x=1,y=0,z=99
提示
不会出现给出的钱买不到100只鸡的情况!
思路点拨:
不能使用穷举法,那样会造成时间超限,我第一次就是用三层for循环,结果造成了时间超限。
下面是我用穷举法的代码。
#include<stdio.h>
int main()
{
int n,x,y,z;
while(~scanf("%d",&n))
{
for(x=0;x<=n/5;x++)
{
for(y=0;y<=(n-5*x)/3;y++)
{
for(z=0;z<=(n-5*x-3*y)*3;z++)
{
if(z+x+y==100)
{
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
}
}
下面是正确的代码,我发现只需要使用两层for循环就行了,最后那个小鸡的只数可以直接根据前面两种鸡的只数算出来(总共100只嘛),但要注意最后那个小鸡的只数不能是负数,所以需要控制一下。
#include<stdio.h>
int main()
{
double n,x,y,z;
while(~scanf("%lf",&n))
{
for(x=0;x<=n/5;x++)
{
for(y=0;y<=(n-5*x)/3;y++)
{
z=100-x-y;
if(z>=0&&z/3+y*3+x*5<=n)//注意最后这种小鸡的只数不能是负数,所以需要控制一下
{
printf("x=%.0lf,y=%.0lf,z=%.0lf\n",x,y,z);
}
}
}
}
}