不难的DFS,直接暴搜就行了,不剪枝也能过
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
namespace
{
vector<int> V, S;
int maxx;
bool flag = false;
void dfs(size_t depth, size_t len, int sum)
{
if (S.size() + V.size() - depth <= len)
return;
if (len == S.size() && binary_search(V.begin(), V.end(), sum))
{
printf("%d", S[0]);
for (size_t i = 1; i < S.size(); i++)
printf("+%d", S[i]);
printf("=%d", sum);
putchar('\n');
flag = true;
}
for (size_t i = depth; i < V.size(); i++)
if (sum + V[i] <= maxx)
{
S.push_back(V[i]);
dfs(i + 1, len, sum + V[i]);
S.pop_back();
}
}
}
int main()
{
int n, m, t;
scanf("%d", &n);
while (n--)
{
scanf("%d", &m);
V.clear();
for (int i = 0; i < m; i++)
{
scanf("%d", &t);
V.push_back(t);
}
sort(V.begin(), V.end());
S.clear();
maxx = V.back();
flag = false;
for (size_t i = 2; i < V.size(); i++)
dfs(0, i, 0);
if (!flag)
puts("Can't find any equations.");
putchar('\n');
}
return 0;
}