从1开始的算法学习 2,什么是穷举法?

分类: 365bet亚洲投注网址 时间: 2025-07-03 18:15:02 作者: admin 阅读: 2674
从1开始的算法学习 2,什么是穷举法?

2,什么是穷举法?

穷举法定义

穷举法也叫枚举算法,最简单,最没有效率。具体的实现方式是,罗列所有可能的情况,找出目标答案。优点是准确性最强,代码简单,缺点是吃时间。

但话虽如此,只要寄予的运算时间足够长,就可以以最简单的方式得到解。因而,穷举法也是竞赛中最常用的方法

例题

火柴棒等式:

火柴棒共n根,可以拼出多少个形如A+B=C的等式?

如果A != B

则A+B和B+A视作不同等式

n根火柴必须全部使用

所用火柴数:

0:6根

1:2根

2:5根

……

祝:不仅限一位数,还有二位数和三位数,比如0+11=11

【输入样例】

14

【输出样例】

2

【输入样例2】

18

【输出样例2】

9

由于穷举法难度过低,直接上代码噢

具体代码

注:该代码所有的具体解释请下移

#include

#include

#include

#include

using namespace std;

int need[] = {6,2,5,5,4,5,6,3,7,6};//用于储存数字使用的火柴棒

int M[2000];//用于储存不同火柴棒可以有多少种思路

int ans;

int match(int cur)

{

int ans=0,ret;

if(cur==0)return 6;

while(cur>0)

{

ret=cur%10;

ans+=need[ret];

cur/=10;

}

return ans;

}

void GetMatch()

{

for(int i=0;i<1999;i++)

{

M[i]=match(i);

}

}

int main()

{

int n;

cin >> n;

GetMatch();

for(int i=0;i<=1000;i++)

{

for(int j=i;j<=1000;j++)

{

int a=M[i];

int b=M[j];

if(a+b > n-6)continue;

int d =M[i+j];

if(a+b+d+4==n && i!=j)ans+=2;

if(a+b+d+4==n && i==j)ans+=1;

}

}

cout << ans;

return 0;

}

对代码的具体解释

1,函数设定

我们在这里设定了两个子函数,分别是

int match(int cur);

void GetMatch();

match函数:返回对应数字所需要的火柴数 GetMatch:将所有数字需要的火柴数扔进2000大数组中

2,match函数

int match(int cur)

{

int ans=0,ret;

if(cur==0)return 6;

while(cur>0)

{

ret=cur%10;

ans+=need[ret];

cur/=10;

}

return ans;

}

首先,读入一个数字,假设是9,那么就会返回6,也就是9对应的火柴棒数量。

同理,如果是26,则会先加上6的,再加上2的火柴棒数量

3,getmatch函数

不用多说,就是将计算结果扔到M中

4,主函数中的循环部分

for(int i=0;i<=1000;i++)

{

for(int j=i;j<=1000;j++)

{

int a=M[i];

int b=M[j];

if(a+b > n-6)continue;

int d =M[i+j];

if(a+b+d+4==n && i!=j)ans+=2;

if(a+b+d+4==n && i==j)ans+=1;

}

}

是的,你没有看错,我们就是要循环整整一百万次。

首先,由于加号和等于一共占4个棒子,同时右边至少有2个棒子(即为1),所以总棒子数最小为6(故n-6);

紧接着,判断是否满足条件,如果满足加法条件,且两数不相等,根据题目+2,相等则+1。

相关文章

利昂内尔·梅西
为什么女人的腿那么白
洛奇英雄传有什么职业玩的人多?洛奇英雄传职业强度排行2025
糖果制作(手工糖果的做法及配料步骤)