hdu 2266 dfs

题意:在数字之间添加运算符号,使得结果等于题目中要求的
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("*****\n");
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\n",sum);
47     }
48 }

 

posted @ 2015-04-25 10:31  miao_a_miao  阅读(134)  评论(0编辑  收藏  举报