列表

详情


XM32. 如何添加运算符

描述

给出一个数字N,对于数字序列 1,2,3 ... N。现在在其中插入“+”, "-", " ",使得表达式的和为M。" "的含义是把相邻的两个数字组成一个数。例如:1 + 2 3 - 4,含义是:1 + 23 - 4 = 20。
给出N和M,求出所有合法的序列的个数。

输入描述

两个整数N,M ( 1 <= N <= 7, -100 <= M <= 100)

输出描述

合法序列的个数

示例1

输入:

7 0

输出:

6

说明:

样例中的六种合法序列
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7

原站题解

C++14 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-05-14

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
   
int n,m,cnt=0;
   
void DFS(int sum, int step)
{
    int i,t=0;
   
    if(sum==m && step==n+1)
        cnt++;
   
    for(i=step;i<=n;i++,t*=10)
    {
        t += i;
        DFS(sum+t, i+1);
        if(step!=1)
            DFS(sum-t,i+1);
    }
}
   
int main()
{
    scanf("%d%d",&n,&m);
    DFS(0,1);
    printf("%d",cnt);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2019-08-26

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int n,m,cnt=0;

void DFS(int sum, int step)
{
    int i,t=0;

    if(sum==m && step==n+1)
        cnt++;

    for(i=step;i<=n;i++,t*=10)
    {
        t += i;
        DFS(sum+t, i+1);
        if(step!=1)
            DFS(sum-t,i+1);
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    DFS(0,1);
    printf("%d",cnt);
    return 0;
}

上一题