给出一个整数集合,判断是否能用集合里的元素构造加法等式,若能则输出按顺序输出所有等式。
简单DFS()应用。
/*
ZOJ 1204 Additive equations
Sample Input
3
3 1 2 3
3 1 2 5
6 1 2 3 5 4 6
Output for the Sample Input
1+2=3
Can't find any equations.
1+2=3
1+3=4
1+4=5
1+5=6
2+3=5
2+4=6
1+2+3=6
*/
#include<iostream>
#include<algorithm>
using namespace std;
bool flag; //判断是否存在等式
int *A; //存储集合
bool *visited; //标识是否计算
void Create(int n){
//创建集合
for(int i=0; i<n; i++){
cin>>A[i];
}
sort(A,A+n);
}
void DFS(int start,int len,int n,int result){
//寻找式子左边长度为len的等式
if(len == 0){
for(int i=start; i<n && A[i]<=result; i++){
if(result == A[i]){
flag = true;
for(int j=0; j<n && result != 0; j++){
if(visited[j]){
if(result == A[j]){
cout<<A[j]<<'='<<A[i]<<endl;
}
else{
cout<<A[j]<<'+';
}
result -= A[j];
}
}
}
}
}
else {
if(len > 0){
for(int i=start; i<n; i++){
if(result + A[i] <= A[n-1]){
result += A[i];
len--;
visited[i] = true;
DFS(i+1,len,n,result);
visited[i] = false;
len++;
result -= A[i];
}
}
}
}
}
void Search(int A[],int n,bool visited[]){
//寻找等式
for(int i=2; i<n; i++){
DFS(0,i,n,0);
}
}
int main(){
int t; //用例数量
int n; //集合元素
cin>>t;
while(t--){
cin>>n;
A = new int[n];
visited = new bool[n];
Create(n);
flag = false;
Search(A,n,visited);
if(!flag){
cout<<"Can't find any equations."<<endl;
}
cout<<endl;
}
return 0;
}