hdu 4403 爆搜

题意:给一串数字,在其间加入若干加号和一个等号,问使等式成立的方案总数

if the digits serial is "1212", you can get 2 equations, they are "12=12" and "1+2=1+2".

一看就是搜索,但是不太好写,还是参考了kuang神和这里

的大神写的

先枚举左边的所有和的情况,然后判断右边是否存在相等的情况

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****
");
15 const int MAXN=20;
16 char s[MAXN];
17 int n,m,tt;
18 ll sum[MAXN][MAXN],len,ans,pos;
19 void dfs2(int i,ll d,ll pre)
20 {
21     if(i>len)
22     {
23         if(pre==d)  ans++;
24         return;
25     }
26     for(int k=i;k<=len;k++)
27     {
28         dfs2(k+1,d+sum[i][k],pre);
29     }
30     return;
31 }
32 void dfs1(int i,ll d)
33 {
34     if(i>pos)   dfs2(pos+1,0,d);
35     for(int k=i;k<=pos;k++) //在第k个位置上放置加号
36     {
37         dfs1(k+1,d+sum[i][k]);
38     }
39     return;
40 }
41 int main()
42 {
43     int i,j,k;
44     #ifndef ONLINE_JUDGE
45     freopen("1.in","r",stdin);
46     #endif
47     while(scanf("%s",s+1))
48     {
49         ans=0;
50         if(s[1]=='E')   break;
51         len=strlen(s+1);
52         for(i=1;i<=len;i++)
53         {
54             for(j=i;j<=len;j++)
55             {
56                 sum[i][j]=0;
57                 for(k=i;k<=j;k++)   sum[i][j]=sum[i][j]*10+s[k]-'0';
58             }
59         }
60         for(pos=1;pos<len;pos++)
61         {
62             dfs1(1,0);
63         }
64         printf("%I64d
",ans);
65     }
66 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4364489.html