题意:在数字之间添加运算符号,使得结果等于题目中要求的
Sample Input
123456789 3
21 1
Sample Output
18
1
这题虽然看起来比较简单,但是之前和差的状态不太好表示,因此就枚举断点,求每个断点之间的数是加数还是减数即可,剪枝依然是+位置状态
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 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("***** "); 14 const int MAXN=1005; 15 char s[15]; 16 int n,m,tt,sum=0,len; 17 __int64 N; 18 void dfs(int pos,__int64 ans) 19 { 20 if(pos==len) 21 { 22 if(ans==N) 23 sum++; 24 return; 25 } 26 __int64 x=0; 27 for(int i=pos;i<len;i++) 28 { 29 x=x*10+s[i]-'0'; 30 dfs(i+1,ans+x); 31 if(pos!=0) dfs(i+1,ans-x); //负号并不能放在第一位 32 } 33 } 34 int main() 35 { 36 int i,j,k; 37 #ifndef ONLINE_JUDGE 38 freopen("1.in","r",stdin); 39 #endif 40 while(scanf("%s",s)!=EOF) 41 { 42 scanf("%I64d",&N); 43 len=strlen(s); 44 sum=0; 45 dfs(0,0); 46 printf("%d ",sum); 47 } 48 }