#include<iostream>
using namespace std;
int n;
const int N=30;
int nums[N]={6,2,5,5,4,5,6,3,7,6};//每个数字对应多少
int a[N];//路径
//不超过24根,那么最大就是999
int count=0;
int match(int x)
{
int k=0;
for(int i=x;i!=0;i/=10)
k+=nums[i%10];
if(x==0)
k+=nums[0];
return k;
}
void dfs(int u,int sum)
{
if(sum>n)
return;
if(u>3)
{
if(a[1]+a[2]==a[3]&&sum==n)
count++;
return;
}
for(int i=0;i<=1000;i++)
{
a[u]=i;
dfs(u+1,sum+match(i));
}//可以有重复的,所以不需要标记
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
n=n-4;
dfs(1,0);//直接列举,不用有个for循环,他会有限制条件
cout<<count;
}
总结一下dfs这种题目的套路
1.main函数里面dfs开始,不要写什么for循环,在上面void里面会有终止条件
2.void函数里面先是到最后一层时候,不要忘记return,后来是搜索没搜过的,如果不能有重复的要加个bool,如果是要求从小到大,那么就从当前数搜,然后++