Money Systems

请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。

 

E.X:

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

怎么做呢。。
直接模拟
但是怎么写更加优美呢。
膜拜大神代码。简单明了
0_0_0_0_0_0_这样的先把字符串模板摆好后,神奇的dfs一下就OK了。
应为填‘ ’的时候需要把上一个数(正or负)*10再(加or减)当前数字,所以我们需要存储一下last 表示最后一个未加入sum(总和)的数字是多少。

其他的,不懂见代码。
模拟一下就OK。
代码:
/*
ID:Andy Chen
LANG:C++
PROG:zerosum
*/
#include<cstdio>
#include<iostream>
using namespace std;
int N;
char str[20];
void dfs(int k,int sum,int last){
    if(k==N){
        if(sum+last==0) cout<<str<<endl;
        return ;
    }
    str[k*2-1]=' ';
    dfs(k+1,sum,last>0?last*10+k+1:last*10-k-1);
    str[k*2-1]='+';
    dfs(k+1,sum+last,k+1);
    str[k*2-1]='-';
    dfs(k+1,sum+last,-k-1);
}
int main()
{
    freopen("zerosum.in","r",stdin);
    freopen("zerosum.out","w",stdout);
    scanf("%d",&N);
    for(int i=0;i<N;++i)
        str[i*2]=char(i+'1');
    dfs(1,0,1);
    return 0;
}

 

你可能感兴趣的:(Money Systems)