版权声明:听说这里是写版权声明的 https://blog.csdn.net/Hpuer_Random/article/details/82492192
How Many Equations Can You Find
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1477 Accepted Submission(s): 990
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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll l,len;
ll cnt;
char str[15];
void DFS(int l,ll sum)// l记录当前所用的字符个数,sum传递的是前 [0,l-1] 个字符经过加减得到的值
{
if(l==len && sum==n)//当字符串全部用完 并且得到的值等于n 时才满足条件
{
cnt++ ;
return ;//一个递归结束
}
ll ans=0;// ans 保存的是以后的值
for(int i=l;i<len;i++)
{
ans=ans*10+str[i]-'0';
DFS(i+1,sum+ans);
if(l)
DFS(i+1,sum-ans);//第一个数字前面不能是减号
}
}
int main()
{
while(~scanf("%s %lld",str,&n))
{
len=strlen(str);
cnt=0;//记录有多少种方式
DFS(0,0);
printf("%d\n",cnt);
}
return 0;
}
/*
对于任意一串数字,我们可以在其中:
添加 +
添加 -
不添加
这一串数字的长度不超过11
复杂度应该是 O(3^11)
DFS(l,sum)
1234 10
DFS(0,0) ->DFS(1,1)// l=0 sum=0;
->DFS(1,12)
->DFS(1,123)
->DFS(1,1234)//对于所有的数字全部用完的情况,都可以直接判断结果是否等于N,然后结束
DFS(1,1) ->DFS(2,1+2)
->DFS(2,1-2)
->DFS(2,1+23)
->DFS(2,1-23)
->DFS(2,1+234)//对于所有的数字全部用完的情况,都可以直接判断结果是否等于N,然后结束
->DFS(2,1-234)//对于所有的数字全部用完的情况,都可以直接判断结果是否等于N,然后结束
DFS(1,12) ->DFS(2,12+3)
->DFS(2,12-3)
->DFS(2,12+34)//对于所有的数字全部用完的情况,都可以直接判断结果是否等于N,然后结束
->DFS(2,12-34)//对于所有的数字全部用完的情况,都可以直接判断结果是否等于N,然后结束
DFS(1,123) ->DFS(2,123+4)
->DFS(2,123-4)
DFS(2,1+2) ->DFS(3,1+2+3)
->DFS(3,1+2-3)
->DFS(3,1+2+34)
->DFS(3,1+2-34)
DFS(2,1-2) ->DFS(3,1-2+3)
->DFS(3,1-2-3)
->DFS(3,1-2+34)
->DFS(3,1-2-34)
DFS(2,1+23) ->.....
DFS(2,1-23) ->.....
DFS(2,1+234)->.....
DFS(2,1-234)->.....
DFS(3,...)->......
DFS(3,...)->......
DFS(3,...)->......
DFS(3,...)->......
DFS(4,...)->......
DFS(4,...)->......
DFS(4,...)->......
DFS(4,...)->......
*/