火柴棒等式
思路:dfs暴力枚举,搜索,具体的看注释叭
ps:n<=24,有4根用于加号,等号,则20根用来拼数字,最大就是11111啦,相当于放缩(来自ch大佬的想法)
ps:思路来自(zyw学长)
#include<iostream> //2021.4.1暴力枚举,搜索
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
long long int ans;
int n;
int num[10]={6,2,5,5,4,5,6,3,7,6};//代表数字i所需火柴根数
int ar[3];//a[0]+a[1]=a[2]
void dfs(int cur)//cur代表搜索层数
{
if(cur==3)//一层一个数,到了第三层就凑齐三个数了
{
int a,b,c,sum=0;
if(ar[0]+ar[1]!=ar[2])//不满足,return,进行下一次遍历
return;
for(int i=0;i<3;++i)//否则分别计算a[0],a[1],a[2]所表示的火柴数,sum计算总和
{
if(ar[i]>=100)//考虑三位数以上的情况
{
a=ar[i]/100;
sum+=num[a];
b=(ar[i]%100)/10;
sum+=num[b];
c=ar[i]%10;
sum+=num[c];
}
else if(ar[i]>=10)//两位数
{
a=ar[i]/10;
b=ar[i]%10;
sum+=num[a];
sum+=num[b];
}
else//个位数
sum+=num[ar[i]];
}
if(sum==n)//火柴用完ans+1
++ans;
return;
}
//在0-199中选一个数作为ar[cur],选了之后进入下一层,每个数都在0-199中遍历过一次,一共200的三次方
for(int i=0;i<=199;++i)//每层选一个数,然后进入下一层
{
ar[cur]=i;
dfs(cur+1);
}
}
int main(void)
{
cin>>n;
n-=4;
dfs(0);//从0开始
cout<<ans;
return 0;
}