题目链接:
https://nuoyanli.com/contest/38/problem/J
题面:
题意:
给出两个整数m,n(0<=n<=m<10^20),YZJ学长想知道m除第一位外的每一位经过‘+’或‘-’运算后的结果等于n的方案数量。
例如 m=1111,n=0,方案:1+1-1-1=0,1-1-1+1=0,1-1+1-1=0 方案数量:3。
例如 m=21,n=1,方案:2-1=1 方案数量:1。
思路:
首先m给的特别大,我们肯定是需要用字符串存储的,然后其实题目中的n的数值如果有方案的情况下。最大也只是20个9相加,所以n的数值其实没有很大,我们只需要用int存储n就可以了,然后第一个数字是一定要加的,我们就从第一个数字往后,用dfs来遍历每一种相加相减的情况,然后当把所有位数都继续加或减完了之后,继续判断这种情况是否满足等于n,如果等于n,就是一种方案,然后ans加1,最后就直接输出ans就是答案。
参考代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
char m[1000];
int n,len,i,ans=0;
void dfs(int x,int y)
{
if(x==len)//当把每一位数字都加完时才进行判断是否等于n的数值
{
if(y==n)//如果最后加起来的数值等于n就意味为一种方案,ans就加1
{
ans++;
}
return ;
}
else//如果还没有把每一位数字都加上,就继续加
{
dfs(x+1,y+m[x]);//加法的情况
dfs(x+1,y-m[x]);//减法的情况
}
}
int main()
{
while(scanf("%s %d",m,&n)!=EOF)
{
ans=0;
len=strlen(m);
for(i=0; i<len; i++)
{
m[i]=m[i]-'0';//先将字符串中对应的字符全部转换为对应的数字
}
dfs(1,m[0]);//因为第一位数字是直接加上去的,所以我们就从第一位为起点,然后开始继续dfs遍历搜索。
printf("%d\n",ans);//最后输出总的方案数目
}
}