hdu 2266 How Many Equations Can You Find(DFS)
How Many Equations Can You Find
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 691 Accepted Submission(s): 450
Problem Description
Now
give you an string which only contains 0, 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9.You
are asked to add the sign ‘+’ or ’-’ between the characters. Just
like give you a string “12345”, you can work out a string “123+4-5”. Now
give you an integer N, please tell me how many ways can you find to
make the result of the string equal to N .You can only choose at most
one sign between two adjacent characters.
Input
Each
case contains a string s and a number N . You may be sure the length of
the string will not exceed 12 and the absolute value of N will not
exceed 999999999999.
Output
The output contains one line for each data set : the number of ways you can find to make the equation.
Sample Input
123456789 3
21 1
Sample Output
18
1
知识点:DFS
题意:给你一个数字字符串,在字符之间加最多一个符号是之等于所给的数。
思路:状态:(当前位置,已得到的数值)
难点:像这样情况如何给出 4+34567-12334;这里要用for循环具体见代码
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 long long n,cnt,num; 6 int vis[20]; 7 char s[20]; 8 int len; 9 void dfs(int p,int num) 10 { 11 if(p==len) 12 {if(num==n) 13 { 14 cnt++; 15 return; 16 }} 17 long long temp=0; 18 for(int i=p;i<len;i++)//难点 19 { 20 temp=temp*10+(s[i]-'0'); 21 dfs(i+1,num+temp); 22 if(p!=0) 23 dfs(i+1,num-temp); 24 } 25 } 26 int main() 27 { 28 while(~scanf("%s%lld",s,&n)) 29 { 30 len=strlen(s); 31 cnt=0; 32 //temp=0; 33 dfs(0,0); 34 printf("%d\n",cnt); 35 } 36 return 0; 37 }