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

2,什么是穷举法?

穷举法定义

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

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

例题

火柴棒等式: 

火柴棒共n根,可以拼出多少个形如A+B=C的等式?
 
 如果A != B
 则A+B和B+A视作不同等式
 
 n根火柴必须全部使用
 
 所用火柴数:
 0:61:22:5根
 ……
 
 祝:不仅限一位数,还有二位数和三位数,比如0+11=11 


【输入样例】
14

【输出样例】
2

【输入样例218

【输出样例29

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

具体代码

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

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值