普通dfs 不过需要减枝
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int arr[35];
int n;
map<int, int> mp;
bool flag = false;
string getstr(int x) {
string str = "";
while (x != 0) {
str = char('0' + x % 10)+str;
x /= 10;
}
return str;
}
void search(int start, int k, int cur, int sum, string equ) {
if (n - start < k - cur)return;//剪枝
if (sum > arr[n - 1])return;//剪枝
if (k == cur) {
for (int i = start; i < n; i++) {
if (arr[i] == sum) {
cout << equ << "=" << sum << endl;
flag = true;
break;
}
}
return;
}
string ns;
for (int i = start; i < n - 1; i++) {
ns = equ;
ns += "+" + getstr(arr[i]);
search(i + 1, k, cur + 1, sum + arr[i], ns);
}
}
int main() {
int t, k, st;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
flag = false;
mp.clear();
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
mp[arr[i]] = 1;
}
sort(arr, arr + n);
for (k = 2; k <= n - 1; k++) {
for (st = 0; st < n - 2; st++) {
string start = getstr(arr[st]);
search(st + 1, k, 1, arr[st], start);
}
}
if (!flag) {
printf("Can't find any equations.\n");
}
printf("\n");
}
}