标签:
1212 12345666 1235 END
2 2 0
1 //2016.8.20 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #define N 20 6 using namespace std; 7 8 int ans, num[N][N], n;//num[i][j]用来记录从i到j位,数字的大小。 9 char s[N]; 10 11 void dfsR(int pos, int leftsum, int rightsum) 12 { 13 if(pos == n && leftsum == rightsum){ 14 ans++; return; 15 } 16 if(leftsum < rightsum)return;//剪枝 17 for(int i = pos; i < n; i++) 18 dfsR(i+1, leftsum, rightsum+num[pos][i]); 19 } 20 21 void dfsL(int pos, int sum, int mid)//pos表示当前处理的位置,sum表示已处理的和,mid表示等号的位置。 22 { 23 if(pos == mid)//对左边dfs完后,对右边dfs 24 dfsR(mid, sum, 0); 25 for(int i = pos; i < mid; i++)//枚举加号位置。 26 dfsL(i+1, sum+num[pos][i], mid); 27 } 28 int main() 29 { 30 while(scanf("%s", s)!=EOF) 31 { 32 if(s[0] == ‘E‘)break; 33 ans = 0; 34 n = strlen(s); 35 for(int i = 0; i < n; i++) 36 { 37 int tmp = 0; 38 for(int j = i; j < n; j++) 39 { 40 tmp += s[j]-‘0‘; 41 num[i][j] = tmp; 42 tmp *= 10; 43 } 44 } 45 for(int i = 1; i < n; i++)//枚举等号的位置,然后暴搜 46 dfsL(0, 0, i); 47 cout<<ans<<endl; 48 } 49 50 return 0; 51 }
标签:
原文地址:http://www.cnblogs.com/Penn000/p/5790057.html