算法入门 - 枚举
Posted So istes immer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门 - 枚举相关的知识,希望对你有一定的参考价值。
枚举就是逐个尝试可能的答案来求解问题
枚举的同时应尽可能去缩小枚举的范围
例题1 完美立方
形如a^3=b^3+c^3+d^3的等式被称为完美立方等式。例如12^3=6^3+8^3+10^3。编写一个程序,对任给的正整数N(N<=100),寻找所有的四组元素(a,b,c,d),使得a^3=b^3+c^3+d^3, 其中a,b,c,d大于1,小于等于N,且b<=c<=d。
分析
a枚举范围 [2, N]
b枚举范围 [2, a-1]
c枚举范围 [b, a-1]
d枚举范围 [c, a-1]
#include <iostream>
using namespace std;
int main(){
int N;
cin >> N;
for (int a=2;a<=N;++a) {
for(int b=2;b<a;++b){
for(int c=b;c<a;++c){
for(int d=c;d<a;++d){
if(a*a*a == b*b*b + c*c*c + d*d*d){
cout << "cube = " << a << ", Triple = (" << b << "," << c << "," << d << ")\\n";
}
}
}
}
}
}
例题2 生理周期
人有体力、情商、智商的高峰日子,它们分别每隔23天、28天和33天出现一次。对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d的天数表示)。例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2。
输入
输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的日子。d是给定的日子,可能小于p, e或 i。所有给
定日子是非负的并且小于或等于365,所求的日子小于或等于21252。
输出
从给定日子起,下一次三个高峰同一天的日子(距离给定日子的天数)。
#include <iostream>
#define N 21252
using namespace std;
int main(){
int p,e,i,d,caseNo=0;
while(cin>>p>>e>>i>>d && p!=-1){
++caseNo;
int k;
for(k=d+1;(k-p)%23;++k);
for(;(k-e)%28;k+=23);
for(;(k-i)%33;k+=23*28);
cout<<"case"<<caseNo<<": the next triple peak occurs in "<<k-d<<" days."<<endl;
}
return 0;
}
效果
0 0 0 0
case1: the next triple peak occurs in 21252 days.
0 0 0 100
case2: the next triple peak occurs in 21152 days.
5 20 34 325
case3: the next triple peak occurs in 19575 days.
4 5 6 7
case4: the next triple peak occurs in 16994 days.
-1 -1 -1 -1
以上是关于算法入门 - 枚举的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《二分枚举》中等02 —— LeetCode 面试题 10.09. 排序矩阵查找
算法入门 01线性枚举(简单 - 第一题)LeetCode 344
⭐算法入门⭐《线性枚举》简单09 —— LeetCode 66. 加一
⭐算法入门⭐《二分枚举》中等05 —— LeetCode 1201. 丑数 III