zoukankan      html  css  js  c++  java
  • 暴力枚举

    • 了解枚举的基本概念。
    • 了解枚举的优缺点。
    • 掌握枚举的经典题型。

    枚举的概念
    枚举就是列出一个范围内的所有成员的程序,或者说是将所有情况都举出,并判断其是否符合题目条件,生活中常见的枚举有星期,里面有星期一、星期二... ...星期日... ...
    在C++里面最常见的枚举就是数组的for循环,这种循环就是把数组中的每一个元素都列举一遍。

    枚举的优缺点
    优点:1.能举出所有情况,保证解为正确解。
    2.能解决许多用其他算法难以解决的问题。
    3.便于思考与编程。
    缺点:为何要叫做暴力枚举呢?因为暴力出奇迹,但是暴力在大多数情况下都是不可取。枚举仅适用于一些规模较小的问题。(否则可能会超时)

    例1:百钱百鸡
    【P1062】一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡。现有100元钱,想买100只鸡。问可买公鸡、母鸡、小鸡各几只?
    【输入描述】无。
    【输出描述】n行,每行3个数字,分别表示公鸡、母鸡、小鸡的数量。
    【样例输入】无
    【样例输出】0 25 75
    ... ...

    百钱百鸡解析
    1.在数学中解决这个问题,我们通常会列出一个方程组,设公鸡x只,母鸡y只,小鸡z只,即:

    同时满足上述两个条件的x、y、z值就是所求。
    2.为了解决以上的问题,我们可以通过三重循环将所有情况都列一遍,然后通过if判断是不是满足条件,如果满足条件,便输出。
    公鸡数量x的取值范围是0~100/5,母鸡数量y的取值范围是0~100/3,小鸡数量z的取值范围是0~3*100(并且要满足小鸡的数量是3的倍数)。
    3.由于题目的特殊性,公鸡、母鸡、小鸡共100只,一旦确定公鸡x和母鸡y的数量,小鸡便只能购买100-x-y只。这样,我们可以尝试写出一个两层循环的程序,解决这个问题。

    百钱百鸡参考代码

    #include <iostream>
    using namespace std;
    int main()
    {    
        int x,y,z;  
        for (x=0;x<=100/5;x++)      
            for (y=0;y<=100/3;y++)       
            {
                z=100-x-y;
                if (5*x+3*y+z/3.0==100)
                   cout<<x<<" "<<y<<" "<<z<<endl;
            }
        return 0;
    }
    

    例2:换钱
    【P1063】某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法,分别是什么?应适当考虑减少循环次数。
    【输入描述】 无
    【输出描述】n行,每行4个数字,分别表示10元、5元、2元、1元的数量。
    【样例输入】无
    【样例输出】1 5 31 3
    ... ...

    换钱解析
    1.因为每种票子至少一张,所以x,y,z,k三个变量的值都要大于等于1,所以x,y,z的最小值应该是1,最大不能达到10,20,50张。即:

    换钱参考代码

    #include <iostream>
    using namespace std;
    int x,y,z,k;  
    int main()
    {    
    	for (x=1;x<10;x++)      
    		for (y=1;y<20;y++)  
    			for (z=1;z<50;z++)     
    			{
    				k=40-x-y-z;
    				if(10*x+5*y+2*z+k==100&&k>0)    
    				{
    					cout<<x<<" "<<y<<" "<<z<<" "<<k<<endl;
    				}
    			}
        return 0;
    }
    

    通过上面的例题,大家对暴力枚举是不是有一定的理解了呢?

    我是bigbigli!!! 更多内容请关注微信公众号:“大李日志”
  • 相关阅读:
    tcpdump教程入门
    ubuntu编译运行xv6
    sed学习笔记
    词典及容错处理
    [译]SpringMVC自定义验证注解(SpringMVC custom validation annotations)
    git指令集合
    linux绝大部分命令集合(自己需要的时候方便查找)
    django中使用AJAX时如何获取表单参数(按钮携带参数)
    正则表达式基础
    linux备份mysql文件并恢复的脚本,以及其中出现的错误:ERROR: ASCII '' appeared in the statement
  • 原文地址:https://www.cnblogs.com/bigbigli/p/13279909.html
Copyright © 2011-2022 走看看