yzj学长的即兴发挥

题目链接:

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);//最后输出总的方案数目
    }
}


发布了55 篇原创文章 · 获赞 12 · 访问量 8983

猜你喜欢

转载自blog.csdn.net/qq_45740533/article/details/103476146