就是给N(N<=15)个线段,用这N个线段组成一个三角形,问能组成多少种三角形。
水题,爆搜即可,时间复杂度3^15。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
int ncase;
int n;
int arr[20];
set<long long>col;
void dfs(int a, int b, int c, int cur)
{
if (cur==n)
{
if (a>b||b>c||a>c) return;
if (a&&b&&c&&a+b>c)
{
long long t = 1000000000000LL*a+1000000LL*b+c;
col.insert(t);
}
return;
}
dfs(a+arr[cur],b,c,cur+1);
dfs(a,b+arr[cur],c,cur+1);
dfs(a,b,c+arr[cur],cur+1);
}
int main()
{
while (EOF!=scanf("%d", &ncase))
{
while (ncase--)
{
col.clear();
scanf("%d", &n);
for ( int i = 0 ; i < n ; i++ )
scanf("%d", arr+i);
dfs(0,0,0,0);
printf("%d\n", col.size());
}
}
return 0;
}