这个题目的意思是将长度为li,,,分成三组,一组和为一边,,,使得其成为一个三角形,问共有多少种三角形,,,,
一开始没有想到要用vector容器,,,,还是有点伤啊,,,,,自己还是不会用这种容器,,,以后多多学习
#include <cstring>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define maxn 300005
#define ll long long
vector<ll>v[maxn];
int n;
int li[30];
int num;
void in(int a,int b,int c)
{
ll p=a*1000000000000+b*100000000+c;
for(int i=0;i<v[c].size();i++)
if(v[c][i]==p)
return ;
num++;
v[c].push_back(p);
}
void DFS(int a,int b,int c,int k)
{
if(k==n)
{
if(a+b>c&&a+c>b&&b+c>a)
{
if(a>b)
{
a=a+b;
b=a-b;
a=a-b;
}
if(b>c)
{
b=b+c;
c=b-c;
b=b-c;
}
if(a>b)
{
a=a+b;
b=a-b;
a=a-b;
}
in(a,b,c);
}
return ;
}
DFS(a+li[k],b,c,k+1);
DFS(a,b+li[k],c,k+1);
DFS(a,b,c+li[k],k+1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<10005;i++)
v[i].clear();
for(int i=0;i<n;i++)
{
scanf("%d",&li[i]);
}
num=0;
DFS(0,0,0,0);
printf("%d\n",num);
}
return 0;
}