就是给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;
}