首页 > 编程语言 >【算法】枚举

【算法】枚举

时间:2024-01-31 17:14:34浏览次数:25  
标签:10 le int 算法 枚举 include 配料

枚举

枚举的思想是不断地猜测,从可能的集合中一一尝试,然后再判断题目的条件是否成立。但是并非所有的情况都要枚举,有时要适当的进行一些剪枝。(如枚举 \(a + b = c\) 且 \(b > a\) 的个数那么 \(b\) 要从 \(a + 1\) 开始枚举)。

通常来说,我们可以限定枚举的范围让它的复杂度更高。虽然这是一种非常基础的算法,但是后面的很多算法都是基于枚举来实现的。

例题 1:

给出 \(n\) 个数 \(a_1, a_2, \cdots, a_n\) 和 \(x\),求有多少对 \(i, j\) 满足 \(a_i + a_j = x\) 且 \(j > i\)。(\(1 \le n \le 10^3\),\(1 \le a_i \le 10^9\))。

我们可以先枚举 \(i\),从 \(1\) 枚举到 \(n\)。每次枚举到一个 \(i\) 时枚举 \(j\),从 \(i + 1\) 枚举到 \(n\)(因为 \(j > i\))。每枚举到一个 \(i, j\) 时判断条件 \(a_i + a_j = x\),如果满足把答案 \(+1\)。时间复杂度 \(O(n^2)\)。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

using ll = long long;

const int kMaxN = 1010, kInf = (((1 << 30) - 1) << 1) + 1;

int n, x, a[kMaxN], ans = 0; // ans 是满足条件的个数
const ll kLInf = 9.22e18;

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> x; // 输入 n, x
  for (int i = 1; i <= n; ++ i) {
    cin >> a[i]; // 输入 ai
  }
  for (int i = 1; i <= n; ++ i) { // 枚举 i,范围 1 至 n
    for (int j = i + 1; j <= n; ++ j) { // 枚举 j,范围 i + 1 至 n
      (a[i] + a[j] == x) && (++ ans); // 如果 ai + aj = x,那么答案 +1(if 压缩)
    }
  }
  cout << ans << '\n'; // 输出答案
  return 0;
}

例题 2:

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 \(10\) 种配料(芥末、孜然等),每种配料可以放 \(1\) 到 \(3\) 克,任意烤鸡的美味程度为所有配料质量之和。现在, Hanke 想要知道,如果给你一个美味程度 \(n\) ,请输出这 \(10\) 种配料的所有搭配方案。(\(1 \le n \le 5000\))

我们可以枚举每一种调料放多少克,最后如果加起来正好等于 \(n\) 就把答案 \(+1\)。输出答案后再枚举一遍,输出每种调料放多少克。

代码:

for (int i = 1; i <= 3; ++ i) {
  for (int j = 1; j <= 3; ++ j) {
    for (int k = 1; k <= 3; ++ k) {
      for (int l = 1; l <= 3; ++ l) {
        for (int p = 1; p <= 3; ++ p) {
          for (int o = 1; o <= 3; ++ o) {
            for (int u = 1; u <= 3; ++ u) {
              for (int m = 1; m <= 3; ++ m) {
                for (int y = 1; y <= 3; ++ y) {
                  for (int t = 1; t <= 3; ++ t) {
                    if (i + j + k + l + p + o + u + m + y + t == n) {
                      ++ ans;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
for (int i = 1; i <= 3; ++ i) {
  for (int j = 1; j <= 3; ++ j) {
    for (int k = 1; k <= 3; ++ k) {
      for (int l = 1; l <= 3; ++ l) {
        for (int p = 1; p <= 3; ++ p) {
          for (int o = 1; o <= 3; ++ o) {
            for (int u = 1; u <= 3; ++ u) {
              for (int m = 1; m <= 3; ++ m) {
                for (int y = 1; y <= 3; ++ y) {
                  for (int t = 1; t <= 3; ++ t) {
                    if (i + j + k + l + p + o + u + m + y + t == n) {
                      cout << i << ' ' << j << ' ' << k << ' ' << l << ' ' << p << ' ' << o << ' ' << u << ' ' << m << ' ' << y << ' ' << t << '\n';
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

标签:10,le,int,算法,枚举,include,配料
From: https://www.cnblogs.com/bc2qwq/p/17999669/enumeration

相关文章

  • 基于文本环境下的强化学习算法:文本游戏环境下的强化学习的一些思考?文本比图像的抽象度
    这里说一个个人的思考,那就是:文本比图像的抽象度更高,或许基于文本的强化学习算法更加强大。基于文本环境的强化学习算法一直被认为是比较小众的一个场景,一般认为文本的AI处理能力是不如图片的,尤其文本对事物描述的能力是十分有限的,但是随着ChatGPT-3.5的大火,或许这个状况得到了......
  • 洛谷题单指南-暴力枚举-P1088 [NOIP2004 普及组] 火星人
    原题链接:https://www.luogu.com.cn/problem/P1088题意解读:火星人的手指可以通过全排列来表示数字,全排列由小到大的顺序即为表示的数字大小,题目可以转化为:给定按顺序全排列中的某一个排列,求往后数m个排列的内容。解题思路:此题与经典全排列问题的差异在于,需要从指定一个排列开......
  • 【算法】斯坦纳树
    参考资料OI-Wiki:斯坦纳树T_a_r_j_a_n:[图论]-------斯坦纳树编程客:集合枚举子集-学习笔记概念斯坦纳树原本是在一个几何图中提出来的问题。在一个平面内给出\(n\)个点\(p_i\),可以加入一些新的点(称为斯坦纳点),要求在使得这些点连通并且边的总长度最小。在OI中,斯坦......
  • 洛谷题单指南-暴力枚举-P1706 全排列问题
    原题链接:https://www.luogu.com.cn/problem/P1706题意解读:n个数全排列问题,本质上,给定n个空位,枚举每个能填入空位的数,依次填入,每个数只能填一次。解题思路:如何填入n个数呢,可以借助于递归,流程如下:dfs(填入第k个数){如果已经填满n个数输出结果返回......
  • 洛谷题单指南-暴力枚举-P1157 组合的输出
    原题链接:https://www.luogu.com.cn/problem/P1157题意解读:在1~n的数中挑选r个,有多少种组合,与P1036类似,有两种做法:二进制法、DFS,下面给出DFS版的代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,r;intt[N];voiddfs(intk){......
  • 洛谷题单指南-暴力枚举-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • 算法模板 v1.6.1.20240131
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • MD5算法:高效安全的数据完整性保障
    摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,MessageDigestAlgorithm5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点,以及它如何解决数据完整性问题和安全性问题。此外,我们还将提供......
  • 深入浅出堆排序: 高效算法背后的原理与性能
    ......
  • 快速排序:高效分割与递归,排序领域的王者算法
    ......