枚举
枚举算法介绍
枚举算法 是一种基本的算法思想,它通过穷举所有可能的情况来解决问题。它的基本思想是将问题的解空间中的每个可能的解都枚举出来,并通过验证和比较 ,找到满足问题条件的最优解或者所有解。
枚举算法适用于问题规模较小、解空间可穷举 的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,由于需要穷举可能的情况,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。
解空间的类型
解空间可以是一个范围内的所有数字 (或二元组、字符串等数据),或者满足某个条件的所有数字。
当然也可以是解空间树,一般可分为子集树和排列树,针对解空间树,需要使用回溯法进行枚举(搜索的知识点会讲到)
我们目前仅使用循环暴力枚举空间,具体的解空间类型需要根据题目来理解构造。
循环枚举解空间
- 首先确定解空间的维度,即问题中需要枚举的变量个数。
例如当题目要求的是
例题:
小明对数位中含有2,0,1,9的数字很敏感(不包括前导0),在1到40中这样的数包含1,2,9,10至32,39,40,共28个,他们的和是574.
请问,在1到n中,所有这样的数的和是多少?
输入描述:
输入格式:
输入一行包含两个整数n(1<=n<=104 )
输出描述:
输出一行,包含一个整数,表示满足条件的数的和。
代码如下:
#include<bits/stdc++.h> 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; }