枚举算法的介绍

枚举

枚举算法介绍

枚举算法 是一种基本的算法思想,它通过穷举所有可能的情况来解决问题。它的基本思想是将问题的解空间中的每个可能的解都枚举出来,并通过验证和比较 ,找到满足问题条件的最优解或者所有解。

枚举算法适用于问题规模较小、解空间可穷举 的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,由于需要穷举可能的情况,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。

解空间的类型

解空间可以是一个范围内的所有数字 (或二元组、字符串等数据),或者满足某个条件的所有数字。

当然也可以是解空间树,一般可分为子集树和排列树,针对解空间树,需要使用回溯法进行枚举(搜索的知识点会讲到)

我们目前仅使用循环暴力枚举空间,具体的解空间类型需要根据题目来理解构造。

循环枚举解空间

  1. 首先确定解空间的维度,即问题中需要枚举的变量个数。

    例如当题目要求的是

例题:

​ 小明对数位中含有2,0,1,9的数字很敏感(不包括前导0),在1到40中这样的数包含1,2,9,10至32,39,40,共28个,他们的和是574.

请问,在1到n中,所有这样的数的和是多少?

输入描述:

​ 输入格式:

​ 输入一行包含两个整数n(1<=n<=104 )

输出描述:

​ 输出一行,包含一个整数,表示满足条件的数的和。

代码如下:

#include
using namespace std;

bool f(int x)
{
	while(x)
    {
        int y = x % 10;
        if(y == 2 || y == 0 || y == 1 || y == 9) 
            return true;
        x /= 10;
    }
    return false;
}

int main()
{
    int m; cin >> m;
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
		if(f(i)) ans += i;
    }
    cout << ans << "\n";
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)