百鸡问题 - 九度 OJ 1045
题目
时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
用小于等于 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
来源:
2009 年哈尔滨工业大学计算机研究生机试真题
枚举是最简单也是最直白的搜索方式,它依次尝试搜索空间中所有的解,测试其是否符合条件,若符合则输出答案,否则继续测试下一组解。
但是在使用枚举这种相对较为暴力的算法来进行解题时,对其时间复杂度要做特别的关注。枚举问题的时间复杂度往往与需要枚举的情况个数有关,因为必须不遗不漏的枚举每一种可能成为答案的情况。所以搜索空间越大,枚举的时间复杂度就越高。所以,在对某一问题进行枚举时,必须保证其时间复杂度在题目时限可以接受的范围内。
本题就是非常适合枚举的一例机试题。首先,它需要枚举的情况十分简单,只需简单的枚举 x,y 的值即可,而 z 可由 100-x-y 的值得到。其次,它的枚举量仅有 100*100 数量级,在题目给定的时间范围内可以枚举完毕。所以,对于此类枚举情况不多,非常适合枚举的考题,无需再去考虑另外更具技巧的解法,毫不犹豫的暴力即可。
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int x=0;x<=100;x++){
//枚举x的值
for(int y=0;y<=100-x;y++){
//枚举y的值,注意它们的和不可能超过100
int z=100-x-y;//计算z的值
if(x*5*3+y*3*3+z<=n*3){
//考虑到一只小小鸡的价格为1/3,
//为避免除法带来的精度损失,这里采用了
//对不等式两端所有数字都乘3的操作,
//这也是避免除法的常用技巧
printf("x=%d,y=%d,z=%d\n",x,y,z);//输出
}
}
}
}
return 0;
}