题意:
考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。
分析:DFS枚举就好了
关键就是 处理‘ ’,用last保存最近的一个连续的整数,不将该数进行运算,sum表示last之前的运算结果
若当前选择了 ' ':sum=sum-last+last*10+s+1(last>0);sum=sum-last+last*10-s-1(last<0); last=last*10+s+1(last>0);last=last*10-s-1(last<0) 若当前选择了 '+':sum=sum+s+1;last=s+1 若当前选择了 '-':sum=sum-s-1;last=-s-1
/*
ID: nanke691
LANG: C++
TASK: zerosum
*/
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
char str[18];
int n;
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);
cin>>n;
for (int i = 0; i < n; ++i)
str[i*2] = i+'1';
DFS(1, 0, 1);
}