题意:给一串数字,在其间加入若干加号和一个等号,问使等式成立的方案总数
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 }