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<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。