百鸡问题 - 九度 OJ 1045

百鸡问题 - 九度 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值