题意:给定一串数字,在这些数字钟插入一些‘+’或者'=' 使得两边相等
思路:首先暴力出这个字符串中任意两个位置的表示的数的大小。。。。
然后枚举等号的位置,两边进行dfs
(dfs一开始实在是没思路。。借鉴http://blog.csdn.net/kk303/article/details/8008058)
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 24; 6 char a[ maxn ]; 7 int num[ maxn ][ maxn ]; 8 int ans,len; 9 int get_num( int x,int y ){ 10 int sum=0; 11 int tmp=1; 12 for( int i=y;i>=x;i-- ){ 13 sum+=( ( a[i]-'0' )*tmp ); 14 tmp*=10; 15 } 16 return sum; 17 } 18 void dfs_right( int y,int pre_sum,int now_sum,int mid ){ 19 if( y>len ){ 20 if( pre_sum==now_sum ) 21 ans++; 22 return ; 23 } 24 for( int k=y;k<=len;k++ ){ 25 dfs_right( k+1,pre_sum,now_sum+num[y][k],mid ); 26 } 27 } 28 void dfs_left( int x,int sum,int mid ){ 29 //if( sum>num[ mid ][ len ] ) 30 //return ;//这个剪枝是错误的!!! 31 if( x>=mid ) { 32 //if( mid==6 ) 33 //printf("sum:%d\n",sum);//it is just for test 34 dfs_right( mid,sum,0,mid );//pos,pre_sum,now_sum,mid 35 } 36 for( int k=x;k<mid;k++ ) 37 dfs_left( k+1,sum+num[x][k],mid ); 38 } 39 int main(){ 40 while( scanf("%s",a+1)!=EOF ){ 41 if( a[1]=='E' ){ 42 break; 43 } 44 len=strlen( a+1 ); 45 memset( num,0,sizeof( num ) ); 46 for( int i=1;i<=len;i++ ){ 47 for( int j=i;j<=len;j++ ){ 48 num[ i ][ j ]=get_num( i,j ); 49 } 50 }// 获得 位置为 i,j 的数的值 51 ans=0; 52 for( int mid=2;mid<=len;mid++ ){//枚举等号的位置 53 dfs_left( 1,0,mid );//pos,now_num,mid 54 } 55 printf("%d\n",ans); 56 } 57 return 0; 58 }