//经典深搜DFS,其中参考了别人的代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n, a[30], visit[30];
bool flag; //判断是否有解(即满足题意的等式)
void DFS(int start, int depth, int sum) //深搜
{
if (depth == 0) // 已经到底了
{
for (int i = start; i < n && sum >= a[i]; i++)
{
if (sum == a[i])
{
flag = true;
for (int j = 0; j <= i; j++)
{
if (visit[j])
{
if (sum == a[j])
//说明a[j]是等式左边最后一个加数了,下面每次sum都减去加数就是为了方便判断
{
cout << a[j] << "=" << a[i] << endl;
}
else cout << a[j] << "+";
sum -= a[j];
}
}//for
} //if
} //for
} //if
else //还没到底,继续深搜
{
for (int i = start; i < n; i++)
{
if (sum + a[i] <= a[n - 1])
{
//以下代码有点像“潜水艇潜进水里作业,作业完成后又浮出水面”
//不得不说这段代码有“对称性”
sum += a[i];
visit[i] = 1;
--depth;
DFS(i + 1, depth, sum);
sum -= a[i];
visit[i] = 0;
++depth;
}
}//for
}//else
}
int main(void)
{
int N;
cin >> N;
while (N--)
{
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
memset(visit, 0, sizeof(int) * 30);
flag = false;
for (int i = 2; i < n; i++) DFS(0, i, 0); //深搜深度范围为[2,n-1](“深度”即equation左边的数字个数)
if (!flag) cout << "Can't find any equations." << endl << endl;
else cout << endl;
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n, a[30], visit[30];
bool flag; //判断是否有解(即满足题意的等式)
void DFS(int start, int depth, int sum) //深搜
{
if (depth == 0) // 已经到底了
{
for (int i = start; i < n && sum >= a[i]; i++)
{
if (sum == a[i])
{
flag = true;
for (int j = 0; j <= i; j++)
{
if (visit[j])
{
if (sum == a[j])
//说明a[j]是等式左边最后一个加数了,下面每次sum都减去加数就是为了方便判断
{
cout << a[j] << "=" << a[i] << endl;
}
else cout << a[j] << "+";
sum -= a[j];
}
}//for
} //if
} //for
} //if
else //还没到底,继续深搜
{
for (int i = start; i < n; i++)
{
if (sum + a[i] <= a[n - 1])
{
//以下代码有点像“潜水艇潜进水里作业,作业完成后又浮出水面”
//不得不说这段代码有“对称性”
sum += a[i];
visit[i] = 1;
--depth;
DFS(i + 1, depth, sum);
sum -= a[i];
visit[i] = 0;
++depth;
}
}//for
}//else
}
int main(void)
{
int N;
cin >> N;
while (N--)
{
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
memset(visit, 0, sizeof(int) * 30);
flag = false;
for (int i = 2; i < n; i++) DFS(0, i, 0); //深搜深度范围为[2,n-1](“深度”即equation左边的数字个数)
if (!flag) cout << "Can't find any equations." << endl << endl;
else cout << endl;
}
return 0;
}