codevs 1983 等式问题 dfs

时间:2022-11-05 15:35:58

题目:
http://codevs.cn/problem/1983/

递推式:a[i][j]:i位到j位的数字,如:a[2][5]=2345;
注意:前面没有空格!!!!所以刚开始没有减的情况;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
char h[12];
int n,a[12][12],ans,cnt;
void dfs(int sum,int l)//从下标l开始搜;
{
if(l==10)
{
if(sum==n) ans++;
return;
}
if(l==1)
{
for(int i=1;i<=9;i++)
if(i>=l) dfs(sum+a[l][i],i+1);//1前面没有空格,所以只能加;
}
else for(int i=1;i<=9;i++)
{
if(i>=l)
{
dfs(sum+a[l][i],i+1);//加
dfs(sum-a[l][i],i+1);//减
}
}
return;
}
void solve()
{
cin>>n;
for(int i=1;i<=9;i++) a[i][i]=i;
for(int i=1;i<=9;i++)
for(int j=i+1;j<=9;j++)
a[i][j]=a[i][j-1]*10+a[j][j];//搜;
dfs(0,1);
cout<<ans;
}
int main()
{
solve();
return 0;
}